HashMap(数组+链表+红黑树)
1、无须,key不可重复,key可为空。线程不安全;
2、1.7之前是数组加链表的数据结构;1.8后是数组加链表加红黑树的结果;
3、初始化的时候不分配默认容量,除非创建对象的时候指定了初始的容量,如果指定大小不是2的几次方,则默认选择这个数之上的次方,如自选9初始容量,则初始化后为16,2的4次方;加载因子默认是0.75,也可以创建对象的时候指定大小,。
3、链表长度到8且数组长度大于64,再次添加则开始尝试树化
4、
LinkedHashMap(数组+链表+红黑树)
LinkedHashMap的底层是继承了hashmap,不同的点是它额外维护了一个双向链表,来保证它的迭代顺序,及插入顺序;缺点是也额外增加了时间/空间的开销。
TreeMap(红黑树)
1、以根节点为初始节点进行检索。
2、与当前节点进行比对,若新增节点值较大,则以当前节点的右子节点作为新的当前
节点。否则以当前节点的左子节点作为新的当前节点。
3、循环递归2步骤知道检索出合适的叶子节点为止。
4、将新增节点与3步骤中找到的节点进行比对,如果新增节点较大,则添加为右子节
点;否则添加为左子节点。
5、按照这个步骤我们就可以将一个新增节点添加到排序二叉树中合适的位置
ConcurrentHashMap(数组+链表+红黑树)
1、JDK1.8之前通过分段锁机制来保证线程安全,1.8后采用乐观锁+Synchronized来保
证线程安全;
1. 若散列桶为空,此时触发乐观锁机制,线程会获取到桶中的版本号,在添加节点之
前,判断线程中获取的版本号与桶中实际存在的版本号是否一致,若一致,则添加成
功,若不一致,则让线程自旋。
2. 若散列桶不为空,此时使用Synchronized来保证线程安全,先访问到的线程会给桶
中的头节点加锁,从而保证线程安全。