Java集合类及并发集合类

ArrayList

1. 可变数组实现,1.5倍扩容

2. 非线程安全

3. 采用了Fail-Fast机制,面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险

LinkedList

1. 双向循环链表实现

2. 非线程安全

3. 元素可为null (对比Deque的另一实现ArrayDeque: 可变数组,元素不可为null,两端增删元素效率高)

HashTable

1. 线程安全

2. k,v不可为null

3. Hashtable在底层将key-value当成一个整体进行处理,这个整体就是一个Entry对象。Hashtable底层采用一个Entry[]数组来保存所有的key-value对,当需要存储一个Entry对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。

HashMap

1. 非线程安全,采用了Fail-Fast机制,通过一个modCount值记录修改次数,在迭代过程中,判断modCount跟初始过程记录的expectedModCount是否相等,如果不相等就表示已经有其他线程修改了Map,马上抛出异常;另外扩容过程中还有可能产生环形链表。

2. k,v可为null

3. 底层使用数组实现,数组中每一项是个单链表,即数组和链表的结合体;当链表长度大于一定阈值时,链表转换为红黑树,这样减少链表查询时间。

4. synchronized是针对整张Hash表的,即每次锁住整张表让线程独占

5. HashMap在底层将key-value当成一个整体进行处理,这个整体就是一个Node对象。HashMap底层采用一个Node[]数组来保存所有的key-value对,当需要存储一个Node对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Node时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Node。

LinkedHashMap

1. LinkedHashMap继承于HashMap,底层使用哈希表和双向链表来保存所有元素

2. 非同步

3. 允许使用null值和null键。

2. 基本操作与父类HashMap相似,通过重写HashMap相关方法,重新定义了数组中保存的元素Entry,来实现自己的链接列表特性。该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而构成了双向链接列表。

HashSet

基于HashMap实现,参考HashMap

LinkedHashSet

继承与HashSet、又基于LinkedHashMap来实现的.