Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将一个集合分配给另一个集合以及执行清除时。两个集合都将被清除_Java_Set_Hashset_Set Operations - Fatal编程技术网

Java 将一个集合分配给另一个集合以及执行清除时。两个集合都将被清除

Java 将一个集合分配给另一个集合以及执行清除时。两个集合都将被清除,java,set,hashset,set-operations,Java,Set,Hashset,Set Operations,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<

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();
}
}
import java.util.HashSet;
导入java.util.Set;
公共类设置操作{
Set a=新的HashSet();
Set b=新的HashSet();
void assignAndClear(){
a、 增加(3);
a、 增加(7);
a、 增加(5);
a、 增加(19);
a、 增加(99);
系统输出打印项次(“a:+a”);
System.out.println(“b:+b”);
b=a;
System.out.println(“分配后”);
系统输出打印项次(“a:+a”);
System.out.println(“b:+b”);
b、 清除();
系统输出打印项次(“清算后”);
系统输出打印项次(“a:+a”);
System.out.println(“b:+b”);
}
公共静态void main(字符串[]args){
SetOperation sd=新的SetOperation();
sd.assignAndClear();
}
}

将一个集合指定给另一个集合时,不会创建新集合,而是创建指向现有集合的新引用。因此,使用
a
对集合所做的任何更改都将反映在
b

这适用于
任何
可变对象

但不适用于不可变的对象

对于.g,考虑<代码>字符串 >:-

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".
在上述情况下,更改不会反映到所有引用,因为
字符串
是不可变的。因此,对字符串所做的任何更改都将创建一个
新对象

但是,如果您有
可变对象
:-

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=newhashset();
Set set3=新的HashSet();//不同的集合对象
Set set2=Set;//指向与“set”相同的set对象
set2.clear();//将清除实际对象。由“集合”指向
//因此,指向该对象的引用都会看到变化。
set3=set;//将引用'set3'更改为指向由'Set'指向的'Set object'`
set3.添加(“a”);//也将更改“set”。
如果要创建集合的副本。这样做:-

Set<String> set1 = new HashSet<String>();
Set<String> set3 = new HashSet<String>(set1);
Set set1=new HashSet();
Set set3=新哈希集(set1);

覆盖对
b
中原始哈希集的内存位置的引用。 您需要将
a
的元素复制到
b
中,而不是将
a
分配到
b

尝试:

b=新哈希集(a);

但我已经独立创建了两个集合,为什么它的引用指向现有的集合?因为,当您将一个
引用指定给另一个引用时,两个引用都指向同一个对象。旧对象将有资格进行垃圾收集。谢谢。很好的澄清b/w可变和不可变对象。
 b = new HashSet<Integer>(a);