因为HashMap的容量是有限的,若是HashMap中的数组的容量很小,假如只有2个,那么若是要放进10个keys的话,碰撞就会很是频繁,此时一个O(1)的查找算法,就变成了链表遍历,性能变成了O(n),这是Hash表的缺陷。算法
为了解决这个问题,HashMap设计了一个阈值,其值为容量的0.75,当HashMap所用容量超过了阈值后,就会自动扩充其容量。数组
在多线程的状况下,当从新调整HashMap大小的时候,就会存在条件竞争,由于若是两个线程都发现HashMap须要从新调整大小了,它们会同时试着调整大小。在调整大小的过程当中,存储在链表中的元素的次序会反过来,由于移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了不尾部遍历。若是条件竞争发生了,那么就会产生死循环了。多线程