JDK1.7和JDK1.8的HashMap区别
JDK7:
HashMap底层是数组加链表的形式
数组的默认长度为16,加载因子为0.75,也就是16*0.75=12(阈值)
当计算出元素的位置在数组中冲突时,那么会以链表的形式存储新的元素,新的元素插在链表的头部,然后将链表下移,也就是将数组中的值赋值给新来的元素,
当数组中12个位置被占据时(也就是达到了阈值),同时新插入的元素的插入位置不为空,就会进行扩容 2倍扩容,
扩容完之后重新计算所有元素的hash值,(会产生死锁)
JDK8:
HashMap底层是数组加链表加红黑树
数组的默认长度为16,加载因子为0.75,也就是16*0.75=12(阈值)
当计算出元素在数组中的位置相同时,则生成链表,并将新的元素插入到尾部,假如链表上元素超过了8个,那么链表将被改为红黑树,同时也提高了增删查效率
当数组元素个数达到了阈值,那么此时不需要判断新的元素的位置是否为空,数组都会扩容,2倍扩容
扩容完之后,之前的元素位置不会发生改变,也就不会产生死锁
JDK1.7和JDK1.8的ConCurrentHashMap区别
HashMap底层是数组加链表的形式
数据结构Segment数组,采用分段锁机制
哈希碰撞形成链表,新的元素插在链表的头部
JDK1.8 中 ConcurrentHashMap 放弃了 HashEntry 结构而是采用了跟 HashMap 结构非常相似,采用 Node 数组加链表(链表长度大于8时转成红黑树)的形式
1.8 中的 ConcurrentHashMap 放弃了 JDK1.7 中的分段技术,而是采用了 CAS 机制 + synchronized 来保证并发安全性
哈希碰撞形成链表,新的元素插入到尾部什么是链表
链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链表又分为单向链表和双向链表,而单向/双向链表又可以分为循环链表和非循环链表,下面简单就这四种链表进行图解说明。
链表结构简要介绍
1.单向链表
单向链表就是通过每个结点的指针指向下一个结点从而链接起来的结构,最后一个节点的next指向null。2.单向循环链表
单向循环链表和单向列表的不同是,最后一个节点的next不是指向null,而是指向head节点,形成一个“环”。
3.双向链表
从名字就可以看出,双向链表是包含两个指针的,pre指向前一个节点,next指向后一个节点,但是第一个节点head的pre指向null,最后一个节点的tail指向null。
4.双向循环链表
双向循环链表和双向链表的不同在于,第一个节点的pre指向最后一个节点,最后一个节点的next指向第一个节点,也形成一个“环”。而LinkedList就是基于双向循环链表设计的。
参考
https://my.oschina.net/90888/blog/1626045
https://blog.csdn.net/qq_36520235/article/details/82417949