【问题标题】:Assigning one set to another and when Clear is performed.Both the sets are getting cleared将一组分配给另一组,并在执行清除时。两组都被清除
【发布时间】:2012-10-14 17:58:27
【问题描述】:

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();
}
}

【问题讨论】:

    标签: java set hashset set-operations


    【解决方案1】:

    当您将一个集合分配给另一个集合时,不会创建新集合,而是会创建一个指向现有集合的新引用。因此,无论您使用 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);
    

    【讨论】:

    • 但是我独立创建了两套,为什么它的参考点指向现有的?
    • 因为,当您将reference 分配给另一个引用时,两个引用都将指向同一个对象。旧对象将有资格进行垃圾回收。
    • 谢谢。很好的澄清 b/w 可变和不可变对象。
    【解决方案2】:

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

    试试:

     b = new HashSet<Integer>(a);
    

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2018-07-17
      • 2015-11-27
      • 2018-08-22
      相关资源
      最近更新 更多