netOpId
test1和test2指向同一个对象,因此结果为真。
cellId
test1和test2指向不同的对象,因此结果为假。
所以问题是,
之间有什么区别 String test1 = "test";
String test2 = "test";
System.out.println(test1 == test2); // true
我对此感到困惑,
String test1 = new String("test");
String test2 = new String("test");
System.out.println(test1 == test2); // false
和
int[] test = {1,2,3}; // literal
int[] test = new int[] {1,2,3}; // non-literal
我预计后一种情况的结果是正确的,与上面的String例子的情况相同。
test1和test2是否指向不同的数组对象?
答案 0 :(得分:2)
Java int[]
不永远intern'd。仅String
(以及有限值的包装类型)。 tl; dr 不要将对象相等与==
进行比较。这仅将引用与实例类型进行比较。这里可以使用Arrays.equals(int[], int[])
和String
String.equals
来确定数组相等性。数组不会覆盖Object#equals(Object)
。
int[] test1 = { 1, 2, 3 };
int[] test2 = { 1, 2, 3 };
System.out.println(Arrays.equals(test1, test2)); // <-- true
System.out.println(test1.equals(test2)); // <-- false
至于它们为什么不同 - Java String
是不可变的(原始类型也是如此)。在这里,我们可以更改其中一个数组中的值。如果对方也改变了,我们会感到惊讶(作为用户)。
答案 1 :(得分:0)
用于声明数组的两种方法都是可能的
int[] a = new int[] {1,2,3,4,5};
int[] b = {7,8,9,10};
但是在声明之后,用第一种方法可以将新数组分配给相同类型的现有变量,而用第二种方法则可以。
a = new int[] {1,1,1,1}; // ok
b = {2,2,2,2,2}; // error: illegal start of expression