这是this question,的重复,但是我正在寻找更多关于"可变键"的更多ELI5解释。和"水桶"在答案中。
这是我的代码,我无法理解:
Main
输出:
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);
为什么不打印出1337,2,3呢?
同样的问题是删除对象。
修改
这就是我想要的,但我相当肯定它不是正确的方法:
FOUND
1
2
3
答案 0 :(得分:2)
你在这里处理原语。您在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
中的指针被删除(因此,没有指针指向对象)。
答案 1 :(得分:0)
当您执行set.remove(i)
&amp; set.add(i)
它会起作用,因为你正在对集合执行操作。
但是当你执行i=1337
时,你只是为变量i
分配一个值而不执行任何设置操作。