两个变量引用相同的集合

时间:2016-05-19 10:46:14

标签: java collections treeset

我有以下代码片段(假设x类型为Integer[]):

Collection<Integer> col1 = new TreeSet<Integer>(Arrays.asList(x));
Collection<Integer> col2 = new TreeSet<Integer>(Arrays.asList(x));

在第二行之后,col1col2引用相同的集合是否属实?

5 个答案:

答案 0 :(得分:2)

没有。这两个变量指的是碰巧包含相同元素的两个不同TreeSet个实例。每个构造函数调用(new TreeSet<Integer>)都会生成TreeSet的不同实例。

为了让两个变量引用同一个实例,您需要将一个变量分配给另一个:

Collection<Integer> col1 = new TreeSet<Integer>(Arrays.asList(x));
Collection<Integer> col2 = col1;

答案 1 :(得分:2)

这取决于你对“相同”的意思。

col1col2将引用两个不同的TreeSet对象,因为在new运算符的两种不同用途中创建了单独的对象。如果您向其中一个添加或删除元素,这些元素不会影响另一个元素。从这个意义上说,他们肯定是不同的

但它们代表了相同的元素集合。在Java中,与equals方法的比较是非常常见且重要的,并且该方法将认为两个不同的TreeSet对象相等。所以在某种意义上它们是相同的(至少在其中一个被修改之前)。

“相同”一词的第一个含义是Java编程环境中的常用词。第二种感觉也很重要,但通常称之为“平等”。

答案 2 :(得分:0)

每次使用new关键字创建对象时,都会创建一个带有新identity的新对象。例如,

Collection<Integer> list = Arrays.asList(1,2,3);
Collection<Integer> list2 = Arrays.asList(1,2,3);
TreeSet<Integer> set = new TreeSet<>(list);
TreeSet<Integer> set2 = new TreeSet<>(list2);

System.out.println(set==set2); // false, reference equality
System.out.println(set.equals(set2)); // true, value equality

答案 3 :(得分:0)

只需扩展 Eran 帖子

Integer[] x = {1,2,3,4,5,6};

    Collection<Integer> col1 = new TreeSet<Integer>(Arrays.asList(x));
    Collection<Integer> col2 = col1;

在上面的代码col2中引用col1 TreeSet<Integer>对象

因此,在这种情况下,如果您尝试更改任何一个对象,则另一个对象也将更改

col1.add(7);
System.out.println(col2.toString());

在上面的代码中,7被添加到col1对象,但它似乎也被添加到col2,因为col2指的是col1和{{1将输出产生为

col2

以下代码同样如此

[1, 2, 3, 4, 5, 6, 7]

输出

col2.add(8);
System.out.println(col1.toString());

答案 4 :(得分:-1)

它们将引用相同的对象集合,但实际上是不同的对象。 请尝试这个测试类:
公共课测试{

public static void main(String[] args) {
  Integer[] arr=new Integer[]{12,10};
  System.out.println(Arrays.asList(arr).hashCode());
  Collection<Integer> col1 = new TreeSet<Integer>(Arrays.asList(arr));
  Collection<Integer> col2 = new TreeSet<Integer>(Arrays.asList(arr));
  System.out.println(col1.hashCode()+":"+col2.hashCode());
  System.out.println(col1.equals(col2));

的System.out.println(COL1 COL2 ==); //假     }

}