我有以下代码片段(假设x
类型为Integer[]
):
Collection<Integer> col1 = new TreeSet<Integer>(Arrays.asList(x));
Collection<Integer> col2 = new TreeSet<Integer>(Arrays.asList(x));
在第二行之后,col1
和col2
引用相同的集合是否属实?
答案 0 :(得分:2)
没有。这两个变量指的是碰巧包含相同元素的两个不同TreeSet
个实例。每个构造函数调用(new TreeSet<Integer>
)都会生成TreeSet
的不同实例。
为了让两个变量引用同一个实例,您需要将一个变量分配给另一个:
Collection<Integer> col1 = new TreeSet<Integer>(Arrays.asList(x));
Collection<Integer> col2 = col1;
答案 1 :(得分:2)
这取决于你对“相同”的意思。
col1
和col2
将引用两个不同的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 ==); //假 }
}