HashMap的transfer里面的部分逻辑不懂,请教?

sean1203 2010-01-05 03:21:59

void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}

Entry[] newTable = new Entry[newCapacity];
transfer(newTable); //transfer这方法逻辑不懂?
table = newTable;
threshold = (int) (newCapacity * loadFactor);
}

/**
* Transfer all entries from current table to newTable.
*/

void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry<K, V> e = src[j];
if (e != null) {
src[j] = null;
do {
Entry<K, V> next = e.next; //从这里开始,我不知道怎么回事,结果
//应该是吧src数组复制给newTable数组,有人能形象点描述出来吗?
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
}

...全文
160 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sean1203 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chdw 的回复:]
简单的说就是遍历旧table中的每个链表,遍历每个链表的每个元素(Entry)

重新计算该Entry应该存放到新table的位置,将该entry放入新table正确位置的链表中
[/Quote]
这个月晚些时候去看数据结构了
谢饿
sean1203 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yetaodiao 的回复:]
先看看API

[/Quote]
我知道是复制
但是复制的步骤
包括e,next,和newTable的指向,复制,引用搞不清楚
ChDw 2010-01-06
  • 打赏
  • 举报
回复
//应该是吧src数组复制给newTable数组,有人能形象点描述出来吗?


这个是不对的,因为HashMap在table[i] 中存放的是一个链表,通过e.next指向下一个元素

但是由于table大小发生了改变,那么原来存放的位置就会发生改变了。所以必须重新计算新的存放位置,所以它需要循环得到所有的e.next
  • 打赏
  • 举报
回复
先看看API
amdgaming 2010-01-06
  • 打赏
  • 举报
回复
Transfer all entries from current table to newTable.
sean1203 2010-01-06
  • 打赏
  • 举报
回复
hallo
ChDw 2010-01-06
  • 打赏
  • 举报
回复
简单的说就是遍历旧table中的每个链表,遍历每个链表的每个元素(Entry)

重新计算该Entry应该存放到新table的位置,将该entry放入新table正确位置的链表中
sean1203 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 apollo_ts 的回复:]
原数据----{数据}---->新容器
[/Quote]
大哥
太深奥了
形象点
而不是抽象。。。
我水平有限。。。
APOLLO_TS 2010-01-05
  • 打赏
  • 举报
回复
原数据----{数据}---->新容器

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧