java hashmap的一点代码的不解

请教大牛,我在hashmap的clear方法,看见
public void clear() {
modCount++;
Entry[] tab = table;
for (int i = 0; i < tab.length; i++)
tab[i] = null;
size = 0;
}
为什么要用局域的tab来指向全局的table,来清理呢,不直接用table来做?
这种类似的操作手法经常看见,一直很疑惑?谢谢

4个回答

clear只对那一瞬间的表进行clear 比如在clear时 进行 扩容 并新增

iteye_7502
iteye_7502 1、比如你在clear 2、这时一个put操作 正好需要扩容 扩容 然后赋值给老的; 3、put完成后 如果clear还没完成 如果你直接在table上操作 刚刚添加的也将被clear 有疑惑:变量table和tab同时指向一个对象,也就是同一个内存地址,那么在使用table把put操作完成后,再使用tab完成clear操作,那么这个时候刚刚被添加上的元素理论上也被删了。因为他们操作的是一个对象啊。是这样吗?
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 不是的 扩容必须新建一个新的 把老的数据复制过去 你看看源代码
大约 8 年之前 回复
u012993141
被掐死的温柔 1、比如你在clear 2、这时一个put操作 正好需要扩容 扩容 然后赋值给老的; 3、put完成后 如果clear还没完成 如果你直接在table上操作 刚刚添加的也将被clear 2012-08-27 14:49.. 有一点没明白: 数组属于引用数据类型 tab 和 table 指向的是同一个数组 当table put进去后 难道tab中就看不到put进去的数据吗?此时tab的清楚 就清楚不到吗??
大约 8 年之前 回复
weixin_42501200
weixin_42501200 你回答的最积极了。我在stackflow上也问了下,老外的说法有更好的阅读性,还有堆栈的数组可以更快的检查边界等,当然你说的也在其中。就选你的答案吧。
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 防止并非修改等的被clear了。当然HashMap也是线程不安全的。
大约 8 年之前 回复
weixin_42501200
weixin_42501200 这个回答很清晰。 不过还有一点疑问的是,为什么clear是对哪一瞬间的表进行clear呢?或者说为什么这样设计,有什么好处?
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 1、比如你在clear 2、这时一个put操作 正好需要扩容 扩容 然后赋值给老的; 3、put完成后 如果clear还没完成 如果你直接在table上操作 刚刚添加的也将被clear
大约 8 年之前 回复
weixin_42501200
weixin_42501200 不是很明白你的意思,可以详细说明下吗。table也是transient
大约 8 年之前 回复

你是说为什么不这样写嘛?
public void clear() {
modCount++;
for (int i = 0; i < table.length; i++)
table[i] = null;
size = 0;
}

weixin_42501200
weixin_42501200 对,要是我自己写的话,就用 table[i] = null;了。
大约 8 年之前 回复

如果在遍历时表扩容了呢
要写只能这样写:
public void clear() {
modCount++;
int len = table.length;
for (int i = 0; i < len; i++)
table[i] = null;
size = 0;
}

并发时的控制
类似 ConcurrentHashMap 和 CopyOnWriteArrayList

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问