HashMap什么时候进行扩容---如何扩容呢?
下文笔者讲述HashMap(jdk1.7)中HashMap扩容的触发点及扩容的操作方法分享,如下所示
jdk1.7扩容的源码分析
//JDK1.7扩容最核心的方法,newTable为新容量数组大小 void transfer(HashMapEntry[] newTable) { //新容量数组桶大小为旧的table的2倍 int newCapacity = newTable.length; //遍历旧的数组桶table for (HashMapEntry<K,V> e : table) { //如果这个数组位置上有元素且存在哈希冲突的链表结构则继续遍历链 while(null != e) { //取当前数组索引位上单向链表的下一个元素 HashMapEntry<K,V> next = e.next; //重新依据hash值计算元素在扩容后数组中的索引位置 int i = indexFor(e.hash, newCapacity); //将数组i的元素赋值给当前链表元素的下一个节点 e.next = newTable[i]; //将链表元素放入数组位置 newTable[i] = e; //将当前数组索引位上单向链表的下一个元素赋值给e进行新的一圈链表遍历 e = next; } } }
HashMap扩容的触发点
当哈希表中Entry数量超过loadFactor加载因子乘以当前table 数组桶长度时 就会触发扩容操作
HashMap扩容操作步骤
1.新建大小为扩容后大小的新数组; 2.取出数组元素 然后遍历以该元素为头的单向链表元素 依据每个被遍历元素的hash值计算其在新数组中的下标然后进行交换即可 注意事项: 扩容后, 原来hash冲突的单向链表尾部会变成扩容后单向链表头部
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。