如何更改 HashSet 中的值?
How to change values in HashSet?
这有点像 this question, 的副本,但是我正在寻找答案中对 "mutable keys" 和 "buckets" 的更多 ELI5 解释。
这是我无法理解的代码:
HashSet<Object> set = new HashSet<Object>();
set.add(1); set.add(2); set.add(3);
for(Object i : set)
if(i.equals(1)) {
i = 1337;
System.out.println("FOUND");
}
for(Object i : set) System.out.println(i);
输出:
FOUND
1
2
3
为什么这不会打印出 1337、2、3?
同样的问题也适用于删除对象。
编辑:
这是我想要的,但我很确定这不是正确的方法:
for(Object i : set)
if(i.equals(1)) {
set.remove(i);
set.add(1337);
break;
}
当您执行 set.remove(i)
& set.add(i)
时,它会起作用,因为您是在集合上执行操作。
但是当您执行 i=1337
时,您只是为变量赋值 i
而不是执行任何设置操作。
您正在处理这里的原语。您在 for
循环中所做的是将值从 Set
复制到 i
,然后用它做一些事情。现在,i
是全新的变量,您更改了它的值,而不是在 Set
中。因此,Set
不变。因此,您必须将其从 Set
中删除,然后输入新值,这样就可以了:
for(Object i : set)
if(i.equals(1)) {
set.remove(i);
set.add(1337);
break;
}
如果你有对象也会发生同样的事情,你会有新的指针,不是同一个对象,而是指向同一个地方的两个指针,所以你会删除一个指针,但是 Set
中的一个会保留,因此 GC
不会删除该对象,直到删除 Set
中的指针(因此,没有指针指向该对象)。
这有点像 this question, 的副本,但是我正在寻找答案中对 "mutable keys" 和 "buckets" 的更多 ELI5 解释。
这是我无法理解的代码:
HashSet<Object> set = new HashSet<Object>();
set.add(1); set.add(2); set.add(3);
for(Object i : set)
if(i.equals(1)) {
i = 1337;
System.out.println("FOUND");
}
for(Object i : set) System.out.println(i);
输出:
FOUND
1
2
3
为什么这不会打印出 1337、2、3?
同样的问题也适用于删除对象。
编辑:
这是我想要的,但我很确定这不是正确的方法:
for(Object i : set)
if(i.equals(1)) {
set.remove(i);
set.add(1337);
break;
}
当您执行 set.remove(i)
& set.add(i)
时,它会起作用,因为您是在集合上执行操作。
但是当您执行 i=1337
时,您只是为变量赋值 i
而不是执行任何设置操作。
您正在处理这里的原语。您在 for
循环中所做的是将值从 Set
复制到 i
,然后用它做一些事情。现在,i
是全新的变量,您更改了它的值,而不是在 Set
中。因此,Set
不变。因此,您必须将其从 Set
中删除,然后输入新值,这样就可以了:
for(Object i : set)
if(i.equals(1)) {
set.remove(i);
set.add(1337);
break;
}
如果你有对象也会发生同样的事情,你会有新的指针,不是同一个对象,而是指向同一个地方的两个指针,所以你会删除一个指针,但是 Set
中的一个会保留,因此 GC
不会删除该对象,直到删除 Set
中的指针(因此,没有指针指向该对象)。