JDK1.8开始HashMap为什么要先插入后扩容,网上查找有说先扩容再插入可以少遍历之类的,其实不管是先扩容还是先插入,它的原则还是尾插法都是避免不了要遍历的,那它为什么还是要先插入呢,只要看插入逻辑和扩充逻辑做了哪些操作就知道了
以下只是个人的理解,如有错误欢迎指点
近几个月收集了收集了N份精校过的PDF版的Java八股文大全,涉及Java后端的方方面面,分享给大家。希望能帮助到大家面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
看这里: 直接获取方式点我
文档版,如下图:
首先看下JDK1.8 HashMap插入的源码
1:插入操作如果数组中的节点是红黑树是往节点中插入节点, 如果是链表的时候可能会要从链表升级成红黑树,似乎先插入再扩容还是先扩容后插入都是没影响的都是要遍历, 那问题原因就在扩容机制里
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
/**
* 这里要满足当前链表的长度>=7,遍历是从根节点开始,因此相当于包括