Java:更新哈希集的哈希集
在下面的示例中,Java:更新哈希集的哈希集,java,set,hashset,Java,Set,Hashset,在下面的示例中,BigSetHashSet由SmallSetHashSet组成。我想清除SmallSet而不清除BigSet 相反,当我在SmallSet上执行clear()命令时,BigSet也被清除。为什么会发生这种情况?我怎样才能只清除SmallSet,而保持BigSet不变 我已经包括了打印声明来说明正在发生的事情 import java.util.HashSet; import java.util.Set; import java.util.Arrays; public class
BigSet
HashSet由SmallSet
HashSet组成。我想清除SmallSet
而不清除BigSet
相反,当我在SmallSet
上执行clear()
命令时,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();
}
}
将
SmallSet
添加到BigSet
时,添加的是集合本身,而不是其中的集合。所以你也可以
BigSet.add(new HashSet(SmallSet));
或
我个人推荐后者
但是,请注意,由于要将集合添加到小集合,如果您执行了以下操作:
Set<Integer> n = new HashSet<Integer>(Arrays.asList(10, 20, 30));
SmallSet.add(n);
BigSet.addAll(SmallSet);
n.remove(20);
System.out.println(BigSet);
Set n=newhashset(Arrays.asList(10,20,30));
加(n);
BigSet.addAll(SmallSet);
n、 移除(20);
System.out.println(BigSet);
您将得到[10,30]
,因为添加到BigSet
的是集合,而不是集合的元素
另外,当我在学校做类似的事情时,我被强烈鼓励去“画盒子”——在黑板、白板或纸上画实体盒子。在这种情况下,您甚至可能希望使用便笺卡,并将它们放在彼此的顶部,以显示在何处。它确实有助于让你的大脑围绕它。当你将SmallSet
添加到BigSet
时,你添加的是集合本身,而不是其中的集合。所以你也可以
BigSet.add(new HashSet(SmallSet));
或
我个人推荐后者
但是,请注意,由于要将集合添加到小集合,如果您执行了以下操作:
Set<Integer> n = new HashSet<Integer>(Arrays.asList(10, 20, 30));
SmallSet.add(n);
BigSet.addAll(SmallSet);
n.remove(20);
System.out.println(BigSet);
Set n=newhashset(Arrays.asList(10,20,30));
加(n);
BigSet.addAll(SmallSet);
n、 移除(20);
System.out.println(BigSet);
您将得到[10,30]
,因为添加到BigSet
的是集合,而不是集合的元素
另外,当我在学校做类似的事情时,我被强烈鼓励去“画盒子”——在黑板、白板或纸上画实体盒子。在这种情况下,您甚至可能希望使用便笺卡,并将它们放在彼此的顶部,以显示在何处。它确实有助于让你的大脑围绕它。当你清除smallSet
时,你不正确地认为你正在清除bigSet
smallSet
仍然在bigSet
中,只是它现在是空的(因为您清除了它)。因此,当您从print语句中看到[[]]
时,它告诉您bigSet
现在包含一个空集(特别是现在为空的smallSet
)
我怀疑你的误解是,你在想象当你添加bigSet
时,它正在复制smallSet
。事实并非如此。它向变量smallSet
引用的同一对象添加引用。调用smallSet.clear
时,您正在清除变量和bigSet
引用的set对象
如果您确实想要smallSet
内部bigSet
的副本,最简单的方法是创建一个新集合,而不是清除smallSet
:
bigSet.add(smallSet);
smallSet = new HashSet<>();
bigSet.add(smallSet);
smallSet=新的HashSet();
当您清除smallSet
时,您清除bigSet
是不正确的smallSet
仍然在bigSet
中,只是它现在是空的(因为您清除了它)。因此,当您从print语句中看到[[]]
时,它告诉您bigSet
现在包含一个空集(特别是现在为空的smallSet
)
我怀疑你的误解是,你在想象当你添加bigSet
时,它正在复制smallSet
。事实并非如此。它向变量smallSet
引用的同一对象添加引用。调用smallSet.clear
时,您正在清除变量和bigSet
引用的set对象
如果您确实想要smallSet
内部bigSet
的副本,最简单的方法是创建一个新集合,而不是清除smallSet
:
bigSet.add(smallSet);
smallSet = new HashSet<>();
bigSet.add(smallSet);
smallSet=新的HashSet();
OP说bigSet是一个包含集合的集合。我不认为OP是在寻找要添加的元素。这很有意义。add(新HashSet(SmallSet))是我一直在寻找的。ThanksI会说BigSet.add(新HashSet…
和BigSet.addAll(…)
做同样的事情,但是addAll的速度是原来的两倍,因为它不必从SmallSet
转储到新HashSet
中。我强烈推荐addAll
overadd(new
OP说bigSet是一个包含集合的集合。我不认为OP在寻找要添加的元素。这很有意义。bigSet.add(new HashSet(SmallSet))就是我要找的。谢谢我会说bigSet.add(new HashSet…)
和bigSet.addAll(…)
执行完全相同的操作,但是addAll的速度是原来的两倍,因为它不必从SmallSet
转储到newhashset
中。我强烈推荐addAll
而不是add(new
你说得对;这正是我想说的。我猜解决方案是SmallSet的新哈希集,正如你所说。谢谢你说得对;这正是我想说的。我猜解决方案是SmallSet的新哈希集,正如你所说。谢谢