java文字数组声明和新方法之间的区别

时间:2018-03-16 10:26:00

标签: java arrays

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是否指向不同的数组对象?

2 个答案:

答案 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