【java基础】集合

103 阅读2分钟

【java基础】集合

  • Collection关系图

image.png

集合是否有序唯一性线程安全底层结构查询增删特点
ArrayList有序可重复不安全数组查询快,增删慢
Vector有序可重复安全数组查询快,增删慢
LinkedList有序可重复不安全链表查询慢,增删快
HashSet无序唯一不安全哈希表
LinkedHashSetFIFO插入有序唯一不安全链表和哈希表
TreeSet有序唯一不安全红黑树
  • Map关系图

image.png

集合是否有序允许null值线程安全底层结构查询增删特点
HashMap无序允许不安全
HashTable无序不允许安全
TreeMap有序
LinkedHashMapFIFO即有序允许不安全

CurrentHashMap源码

ConcurrentHashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树是为了提高查找效率。

put函数底层调用了putVal进行数据的插入,对于putVal函数的流程大体如下:

① 判断存储的key、value是否为空,若为空,则抛出异常,否则,进入步骤②
② 计算key的hash值,随后进入无限循环,该无限循环可以确保成功插入数据,若table表为空或者长度为0,则初始化table表,否则,进入步骤③
③ 根据key的hash值取出table表中的结点元素,若取出的结点为空(该桶为空),则使用CAS将key、value、hash值生成的结点放入桶中。否则,进入步骤④
④ 若该结点的的hash值为MOVED,则对该桶中的结点进行转移,否则,进入步骤⑤
⑤ 对桶中的第一个结点(即table表中的结点)进行加锁,对该桶进行遍历,桶中的结点的hash值与key值与给定的hash值和key值相等,则根据标识选择是否进行更新操作(用给定的value值替换该结点的value值),若遍历完桶仍没有找到hash值与key值和指定的hash值与key值相等的结点,则直接新生一个结点并赋值为之前最后一个结点的下一个结点。进入步骤⑥
⑥ 若binCount值达到红黑树转化的阈值,则将桶中的结构转化为红黑树存储,最后,增加binCount的值。

Java集合类常用哪些,ArrayList与LinkedList区别