Java:更新哈希集的哈希集

时间:2017-11-08 00:10:58

标签: java set hashset

在下面的示例中,BigSet HashSet由SmallSet HashSet组成。我想清除SmallSet而不清除BigSet

相反,当我在clear()上执行SmallSet命令时,BigSet也会被清除。为什么会这样?我怎样才能清除SmallSet,同时保持BigSet完整无缺?

我已经包含了印刷陈述来说明正在发生的事情。

import java.util.HashSet;
import java.util.Set;
import java.util.Arrays;

public class G{
    public static final HashSet<HashSet> BigSet = new HashSet <HashSet>();
    public static final HashSet<Set> SmallSet = new HashSet<Set>();

    public static Set<Integer> method() {
        Set<Integer> n = new HashSet<Integer>(Arrays.asList(10, 20, 30));
        SmallSet.add(n);
        BigSet.add(SmallSet);
        System.out.println(SmallSet);
        System.out.println(BigSet);
        SmallSet.clear();
        System.out.println(SmallSet);
        System.out.println(BigSet);
        return n;
    }

    public static void main(String[] args) {
        method();
    }
}

输出:

[[20, 10, 30]]
[[[20, 10, 30]]]
[]
[[]]

2 个答案:

答案 0 :(得分:1)

SmallSet添加到BigSet时,您需要添加集合本身,而不是其中的集合。所以你可以

BigSet.add(new HashSet(SmallSet));

BigSet.addAll(SmallSet);

我个人推荐以后。

但请注意,因为您将Set添加到小集中,如果您执行了以下操作:

    Set<Integer> n = new HashSet<Integer>(Arrays.asList(10, 20, 30));
    SmallSet.add(n);
    BigSet.addAll(SmallSet);
    n.remove(20);
    System.out.println(BigSet);

你会得到[10, 30]因为它是SET而不是添加到BigSet的SET元素。

另外,当我在学校做这样的事情的时候,我强烈建议我画一些盒子&#34; - 黑板或白板或纸上的物理盒。在这种情况下,您甚至可能希望使用记事卡并将它们放在彼此之上以显示其中的内容。它确实有助于将你的大脑包裹起来。

答案 1 :(得分:1)

当您清除bigSet时清除smallSet,这是不正确的。 smallSet仍在bigSet内,只是它现在是空的(因为你清除了它)。因此,当您从print语句中看到[[]]时,它告诉您bigSet现在包含一个空集(特别是现在为空的smallSet)。

我怀疑您的误解是,您在想象bigSet在添加smallSet时正在复制smallSet。它不是。它添加了对变量smallSet.clear引用的同一对象的引用。当您致电bigSet时,您正在清除变量和smallSet引用的设定对象。

如果你真的想在bigSet内找到smallSet的副本,最简单的方法就是创建一个新集而不是清除bigSet.add(smallSet); smallSet = new HashSet<>();

'Old_video/\udcc2\udce8\udce4\udce5\udcee\udcef\udcf0\udce8\udcea\udcee\udceb\udcfb'