引用同一集合的两个变量
Two variables referencing the same collection
我有以下代码片段(假设x
是Integer[]
类型):
Collection<Integer> col1 = new TreeSet<Integer>(Arrays.asList(x));
Collection<Integer> col2 = new TreeSet<Integer>(Arrays.asList(x));
第二行后,col1
和col2
是否引用了同一个集合?
没有。这两个变量指的是恰好包含相同元素的两个不同的 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" 的理解。
col1
和 col2
将引用两个不同的 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
引用了col1
TreeSet<Integer>
对象
所以在这种情况下,如果您尝试更改任何一个对象,另一个对象也会更改
col1.add(7);
System.out.println(col2.toString());
在上面的代码中,7 被添加到 col1
对象,但它似乎也被添加到 col2
,因为 col2
指的是 col1
和 col2
产生输出
[1, 2, 3, 4, 5, 6, 7]
同样适用于下面的代码
col2.add(8);
System.out.println(col1.toString());
输出
[1, 2, 3, 4, 5, 6, 7, 8]
我有以下代码片段(假设x
是Integer[]
类型):
Collection<Integer> col1 = new TreeSet<Integer>(Arrays.asList(x));
Collection<Integer> col2 = new TreeSet<Integer>(Arrays.asList(x));
第二行后,col1
和col2
是否引用了同一个集合?
没有。这两个变量指的是恰好包含相同元素的两个不同的 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" 的理解。
col1
和 col2
将引用两个不同的 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
引用了col1
TreeSet<Integer>
对象
所以在这种情况下,如果您尝试更改任何一个对象,另一个对象也会更改
col1.add(7);
System.out.println(col2.toString());
在上面的代码中,7 被添加到 col1
对象,但它似乎也被添加到 col2
,因为 col2
指的是 col1
和 col2
产生输出
[1, 2, 3, 4, 5, 6, 7]
同样适用于下面的代码
col2.add(8);
System.out.println(col1.toString());
输出
[1, 2, 3, 4, 5, 6, 7, 8]