在Java中比较整型数组,为什么不能使用==?

8
我正在学习Java,刚刚发现了一个微妙的事实:如果我声明两个整数数组,并使用==比较它们,即使两个数组拥有相同的元素,结果也是false。这是为什么呢?难道比较不应该得到true的结果吗?
public class Why {

    public static void main(String[] args) {
        int[] a = {1, 2, 3};
        int[] b = {1, 2, 3};

        System.out.println(a == b);
    }

}

提前感谢您!


22
不行,因为 == 比较的是引用而非值。 - Richard J. Ross III
3
其他人已经回答了这个问题,但我想补充一下,在Java或任何具有对象或结构体引用的语言中,这是非常重要的事情。按照现在的写法,你正在创建两个分开的对象,它们恰好有相同的数字。如果你写成"int[] b = a;",那么b将指向与a相同的内存,然后a==b将为真。 - jfrank
@jfrank 这有点太泛泛了。例如,C#和Python确实将对象作为引用,但==运算符仍会给出正确的结果(至少对于Python来说是这样的,C#在这方面确实有其自身的缺陷)。 - Voo
我并不是想暗示“==”在每种语言中的行为都相同,如果是这样的话,那就是我的失误。 我的意思是强调理解引用和内存的概念对于在这些语言中成功编程的重要性。 在我的看法中,“==”运算符没有“正确”的行为方式,因为当你有引用时,相等性是一个微妙的概念。 如果您不了解引用,就没有机会正确地了解不同类型的相等性。 - jfrank
3个回答

35

使用Arrays.equals(arr1, arr2)方法。

==运算符只检查两个引用是否指向同一个对象。

测试:

int[] a = {1, 2, 3};
int[] b = a;    
System.out.println(a == b);   // returns true as b and a refer to the same array  

int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(Arrays.equals(a, b));   //returns true as a and b are meaningfully equal

如何在不使用循环的情况下找到差异? - e-info128

1

0
如果你在使用Object的时候使用==操作符,你比较的是引用而不是
如果你在使用原始类型(intlongboolean等)时使用==操作符,则会检查它们是否具有相同的值。
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};

System.out.println(a == b); //return false;

System.out.println(a[0] == b[0]); //return true;



String[] a1 = {"Cat", "Dog", "Mouse"};
String[] b2 = {"Cat", "Dog", "Mouse"};

System.out.println(a1 == b1); //return false;

System.out.println(a1[0] == b1[0]); //return false; Because String are Object

你可以使用 Arrays.equals(array1, array2) 方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接