1.初步创建了两套。 2.为一组添加元素。 3.分配一套到另一套。 4.如果在一组上调用clear,则两组都被清除。
任何人都可以帮忙解决问题吗?
import java.util.HashSet;
import java.util.Set;
public class SetOperation {
Set<Integer> a = new HashSet<Integer>();
Set<Integer> b = new HashSet<Integer>();
void assignAndClear(){
a.add(3);
a.add(7);
a.add(5);
a.add(19);
a.add(99);
System.out.println("a:" +a );
System.out.println("b:" +b );
b=a;
System.out.println("After assigning");
System.out.println("a:" +a );
System.out.println("b:" +b );
b.clear();
System.out.println("after clearing");
System.out.println("a:" +a );
System.out.println("b:" +b );
}
public static void main(String[] args) {
SetOperation sd = new SetOperation();
sd.assignAndClear();
}
}
答案 0 :(得分:4)
当您将一个集合分配给另一个集合时,不会创建新集合,而是创建指向现有集合的新引用。因此,使用a
对集合所做的任何更改都会反映在b
。
对于any
可变对象,这是正确的。
但不适用于Immutable
对象。
例如,考虑String
的情况: -
String s = "a";
String s1 = s; // Both `s` and `s1` points to `"a"`
s1 = "b"; // Only s1 will point to "b". `s` still points to "a".
在上述情况下,更改不会反映到所有引用,因为Strings
是不可变的。因此,您对String所做的任何更改都将创建new object
。
但是,如果你有mutable object
: -
Set<String> set = new HashSet<String>();
Set<String> set3 = new HashSet<String>(); // A different set object
Set<String> set2 = set; // Point to the same set object as "set"
set2.clear(); // Will clear the actual object. Pointed by "set"
// And thus both the reference pointing to that object, will see the change.
set3 = set; // Change reference `set3` to point to the `Set object` pointed by `set`
set3.add("a"); // Will change `set` also.
如果要创建Set的副本。这样做: -
Set<String> set1 = new HashSet<String>();
Set<String> set3 = new HashSet<String>(set1);
答案 1 :(得分:2)
您在b
中覆盖对原始哈希集的内存位置的引用。
您需要将a
的元素复制到b
,而不是将a
分配给b
。
尝试:
b = new HashSet<Integer>(a);