1.hashmap不能用于多线程场景中,多线程下推荐使用concurrentHashmap!
主要原因就在于其的扩容机制。
2.hashmap 扩容机制
创建一个新的newtab 替代 oldtab。然后数据迁移,但是1.7版本时才有头插入法。如下图(图是网上找的)
单线程:
1.7扩容代码
1 do {
2 //保留要转移指针的下一个节点
3 Entry<K,V> next = e.next;
4 //计算出要转移节点在hash桶中的位置
5 int i = indexFor(e.hash, newCapacity);
6 //使用头插法将需要转移的节点插入到hash桶中原有的单链表中
7 e.next = newTable[i];
8 //将hash桶的指针指向单链表的头节点
9 newTable[i] = e;
10 //转移下一个需要转移的节点
11 e = next;
12 } while (e != null);
多线程:
线程2扩容完成,线程一扩容
线程1改动ke7位置,原来的线程2里面的key7的e和key3的next没了,e=key3,next=null。
线程一调动key3到key 头部,然后形成循环