https://zhuanlan.zhihu.com/p/21673805
https://note.youdao.com/ynoteshare1/index.html?id=f50290f090db045c36036a2a4b57ba24&type=note
https://zhuanlan.zhihu.com/p/34301705
HashTable 的扩容机制
void resize(int newCapacity){//jdk1.7
Entry[] oldTable = table;//引入扩容前的entry数组
int oldCapacity = oldTable.length;
if(oldCapacity == MAXNUM_CAPACITY){
threshold = Interger.MAX_VALUE;
return;
}
Entry[] newTable = new Entry[newCapacity];
transfer(newTable);
table = newTable;
threshold = (int) (newCapacity*loadFactor);
}
transfer方法将原有的Entry数组的元素拷贝到新的Entry数组里
1 void transfer(Entry[] newTable) {
2 Entry[] src = table; //src引用了旧的Entry数组
3 int newCapacity = newTable.length;
4 for (int j = 0; j < src.length; j++) { //遍历旧的Entry数组
5 Entry<K,V> e = src[j]; //取得旧Entry数组的每个元素
6 if (e != null) {
7 src[j] = null;//释放旧Entry数组的对象引用(for循环后,旧的Entry数组不再引用任何对象)
8 do {
9 Entry<K,V> next = e.next;
10 int i = indexFor(e.hash, newCapacity); //!!重新计算每个元素在数组中的位置
11 e.next = newTable[i]; //标记[1]
12 newTable[i] = e; //将元素放在数组上
13 e = next; //访问下一个Entry链上的元素
14 } while (e != null);
15 }
16 }
17 }
对旧数组中的每一个元素e:先计算每一个元素在新的数组中的位置,e.next指向新数组所在位置(首次为null),将每一个元素赋值给新的数组中对应的位置,e指向e所在链表(如果存在链表的话)的下一个元素;从而下一个元素进来时总是在靠近数组此位置的第一个位置(实现了链表头部插入)
本文深入解析了HashTable在Java 1.7版本中的扩容机制,详细介绍了如何通过transfer方法实现旧数组向新数组的数据迁移,包括重新计算元素位置、链表头部插入等关键步骤。
1285

被折叠的 条评论
为什么被折叠?



