![](https://img-blog.csdnimg.cn/20190928124726749.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
【JavaSE源码分析】
文章平均质量分 94
JavaSE源码分析
青山师
编码、架构、程序人生;此博客输出内容永久免费,长期分享JAVA开发技术
展开
-
【面试长文】HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异
JDK1.8引入了红黑树,降低了链表过长的可能性,提高了效率。JDK1.8使用synchronized+CAS控制并发扩容,避免锁定整个table,提高了并发度。JDK1.8对null key做了优化,null键值对存储在table[0]位置。三个版本的HashMap都采用链表散列结构,通过key的hashCode映射到table,如果hash冲突就采用链表存储。扩容的阈值loadFactor在三个版本都是0.75,阈值size和table大小的乘积超过loadFactor时触发扩容。原创 2023-04-30 13:51:09 · 1161 阅读 · 0 评论 -
HashMap的关键性源代码进行解读
对于相同的键,hashCode()方法返回的哈希值是相同的,但是对于不同的键,哈希值不一定不同,因此在映射到数组下标位置时可能会出现冲突。下面我将结合HashMap的源码,深入讲解HashMap的实现细节和背后的实现原理。需要注意的是,扩容是一项比较耗费性能的操作,所以如果可以预测 HashMap 的元素数量,应该在创建 HashMap 时设置其初始容量,避免在后续使用过程中频繁扩容。先通过哈希函数计算键的哈希值,然后找到对应桶中的链表(或红黑树),再逐一遍历链表(或查找红黑树),直到找到对应的键值对。原创 2023-04-13 20:19:53 · 598 阅读 · 0 评论