如何更改 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 中的指针(因此,没有指针指向该对象)。