HashMap知识,ArrayList知识

本文深入解析了HashTable在Java 1.7版本中的扩容机制,详细介绍了如何通过transfer方法实现旧数组向新数组的数据迁移,包括重新计算元素位置、链表头部插入等关键步骤。

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所在链表(如果存在链表的话)的下一个元素;从而下一个元素进来时总是在靠近数组此位置的第一个位置(实现了链表头部插入)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值