0

这有点像这个问题的重复,但是我正在寻找更多关于答案中“可变键”和“桶”的 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;
        }
4

2 回答 2

3

您在这里处理原语。你在循环中所做的是将值从tofor复制,然后用它做一些事情。现在,是全新的变量,您更改了它的值,而不是在. 因此,不变。因此,您必须从中删除它,然后输入新值,这样就可以了:SetiiSetSetSet

for(Object i : set)
        if(i.equals(1)) {
            set.remove(i);
            set.add(1337);
            break;
        }

如果你有对象也会发生同样的事情,你会有新的指针,不是同一个对象,而是两个指向同一个地方的指针,所以你会删除一个指针,但Set会保留一个指针,所以GC不会删除对象,直到指针 inSet被删除(因此,没有指针指向对象)。

于 2016-05-05T04:22:14.407 回答
0

当您执行set.remove(i)&set.add(i)时,它会起作用,因为您正在对集合执行操作。

但是当你这样做时,i=1337你只是为变量赋值i而不执行任何设置操作。

于 2016-05-05T04:18:47.397 回答