引用同一集合的两个变量

Two variables referencing the same collection

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

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

第二行后,col1col2是否引用了同一个集合?

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

实例

为了使两个变量都引用同一个实例,您需要将一个变量赋给另一个变量:

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

每次使用 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

这取决于您对 "same" 的理解。

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

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

"same" 这个词的第一个含义是 Java 编程上下文中的常见含义。第二个意义也很重要,但通常称为"equality"。

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

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);//假 }

}

只是扩展了 Eran 的 post

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

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

上面代码中col2引用了col1TreeSet<Integer>对象

所以在这种情况下,如果您尝试更改任何一个对象,另一个对象也会更改

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

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

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

同样适用于下面的代码

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

输出

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