史上最详细的 JDK 1.8 HashMap 源码解析_程序员囧辉-CSDN博客_hashmap1.8可能是史上最详细的 HashMap 源码解析。https://blog.csdn.net/v123411739/article/details/78996181疫苗:Java HashMap的死循环 | 酷 壳 - CoolShell
https://coolshell.cn/articles/9606.html什么?HashMap竟然也有懒加载?_小饭饭带你玩waigua的博客-CSDN博客不花时间的导读:这是《好好面试系列》第28篇原创文,该系列主要分享小饭饭面试别人、和被别人面试的经历,该篇文章主要分享HashMap高频面试题,有兴趣的看看,已经知道的可以无视。前几天H同...
https://blog.csdn.net/qq_24557827/article/details/119745908Java中HashMap底层实现原理(JDK1.8)源码分析_tuke_tuke的博客-CSDN博客_hashmap底层实现原理这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一样,原来他们没有指定JDK版本,很多文章都是旧版本JDK1.6.JDK1.7的。现在我来分析一哈最新的JDK1.8的HashMap及性能优化。在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值
https://blog.csdn.net/tuke_tuke/article/details/51588156?ops_request_misc=&request_id=&biz_id=102&utm_term=hashmap%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-51588156.nonecase&spm=1018.2226.3001.4187
HashMap1.8扩容总结
initialCapacity: 刚开始赋值给 threshold ,后来会通过if (oldThr > 0)这个分支 newCap = oldThr (==threshold );将initialCapacity值赋值给newCap,这时候threshold就被更新为 initialCapacity*0.75
HashMap主要有两种构造函数:
下面的代码片段都是resize方法里,计算map大小的代码:
1>不带initialCapacity
这种构造函数会设置
this.loadFactor = DEFAULT_LOAD_FACTOR;
当第一次put或调用resize方法时会进行初始化,直接进下面这个分支:
else {
// 3.老表的容量为0, 老表的阈值为0,这种情况是没有传初始容量的new方法创建的空表,将阈值和容量设置为默认值
newCap = DEFAULT_INITIAL_CAPACITY;
newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
}
懒加载初始化后,就会直接设置这个map大小为16 Thr为16*loadFactor
2>带initialCapacity
这时候直接设置Map的的小为initialCapacity 这个initialCapacity处理后,使得其达到2^n后就赋值给threshold,也就是下面的 oldThr > 0
if (oldThr > 0)
newCap = oldThr; // initial capacity was placed in threshold
// 当传入初始大小时initialCapacity ,走带初始值的构造函数时,这个Map的初始大小被放在
//threshold中,当第一次Put时就会检测到
// 数组大小为0即oldcap=0,而oldThr(threshold)不为空,这时候就知道
// 是传入了初始值的情况,这时候就知道threshold的值就是传入的初始值,这时候会把他传给newCap,
//然后threshold=newCap* 0.75 ,这样当传入初始大小时initialCapacity的初始化完成
上面两个if分支都是map中tab为null, 即第一次调用put/resize,触发了初始化时机时会走,当初始化过后以后再扩容会直接走这个分支:
tab扩大2倍或直接到达上限
// 1.老表的容量不为0,即老表不为空
if (oldCap > 0) {
// 1.1 判断老表的容量是否超过最大容量值:如果超过则将阈值设置为Integer.MAX_VALUE,并直接返回老表,
// 此时oldCap * 2比Integer.MAX_VALUE大,因此无法进行重新分布,只是单纯的将阈值扩容到最大
if (oldCap >= MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return oldTab;
}
// 1.2 将newCap赋值为oldCap的2倍,如果newCap<最大容量并且oldCap>=16, 则将新阈值设置为原来的两倍
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
oldCap >= DEFAULT_INITIAL_CAPACITY)
newThr = oldThr << 1; // double threshold
}
tableForSzie:
红黑树 && 2 3 4树
从2-3-4树到红黑树(上) - nullzx - 博客园欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 相关博客: 从2-3-4树到红黑树(中) 从2-3-4树到红黑树(下) 1. 2-3-4https://www.cnblogs.com/nullzx/p/6111175.html 彻底理解红黑树(三)之 删除 - 简书彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的删除情况相对插入会复杂一些,这里以个人认为较好理解和记忆的方式进行分...https://www.jianshu.com/p/84416644c080 Red/Black Tree Visualization
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html