说一下你了解的 Map
Map 同样也是我们日常开发中使用频率非常高的集合类。
Map 是一个支持 key-value 也就是 键值对 存储的对象。其中,键对象不允许重复,而值对象可以重
复,并且值对象还可以是 Map 类型的,就像数组中的元素还可以是数组一样。
Map 接口的实现类有:HashMap、TreeMap、LinkedHashMap 类。
HashMap 是我们最常用的 Map 实现了,HashMap 的底层构造就是 数组 + 链表,它会根据 key 的
hashCode 值存储数据,可以使用 get(key) 来获取键对应的值,HashMap 不是线程安全的容器,并且
只能允许一条 null 键值对。在 HashMap 中元素比较少的时候,HashMap 是以链表的形式存储元素
的,等到数据量到达一定程度后,链表会转为红黑树进行存储。
TreeMap 是一个红黑树的 Map,它会对键按照指定的顺序进行排序,TreeMap 不是一个线程安全的
Map,TreeMap 中不能允许 null 值,否则会抛出空指针异常。
LinkedHashMap 保证了元素的插入顺序,在查询遍历时会比 HashMap 慢,同样也不是线程安全的容
器。LinkedHashMap 可以允许空元素。
值得注意的是,Map 的实现还有 Hashtable 和 ConcurrentHashMap,这两个元素都是线程安全的
Map。
Hashtable 我们一般不常用,因为它的线程安全都只是使用了简单暴力的 synchronized 同步锁,同步
锁的开销比较大,不推荐使用。
还有最后一个就是 ConcurrentHashMap 了,ConcurrentHashMap 是一个基于多线程高并发的
Map,它经常用于多线程场景,ConcurrentHashMap 的底层使用了分段锁,分段锁对每个段进行加
锁,在保证线程安全的同时降低了锁的粒度。
ArrayList 、LinkedList 和 Vector 的区别
ArrayList 是实现了基于动态数组的数据结构,LinkedList 基于链表的数据结构。
对于随机访问 get 和 set 操作,ArrayList 要优于 LinkedList,因为 LinkedList 要移动指针。
对于新增和删除操作 add 和 remove,LinedList 比较占优势,因为 ArrayList 要移动数据。