如何在HashSet中更改值?

时间:2016-05-05 04:10:44

标签: java set key hashset buckets

这是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

2 个答案:

答案 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分配一个值而不执行任何设置操作。