如何在Java中比较整型数组?

5

当我尝试比较两个int数组时,即使它们完全相同,在if (one == two)中的代码仍然不会被执行。为什么会这样?

Object[] one = {1,2,3,4,5,6,7,8,9};
Object[] two = {1,2,3,4,5,6,7,8,9};

if (one == two){
    System.out.println("equal");
} else {
    System.out.println("not equal");
}

4
你可以使用 Arrays.equals(one,two)。请记住,这里顺序很重要。 - Deendayal Garg
谢谢您的建议。我可以问一下为什么我不能使用“==”比较两个int数组吗? - Thor
2
当你使用“==”比较两个int数组时,实际上是在比较数组引用而不是数组内容。 - Deendayal Garg
1
@TonyStark 因为如果你执行 one == two,你比较的是引用而不是内容... - ΦXocę 웃 Пepeúpa ツ
6个回答

6

这里需要注意的几点:

  • ==比较的是引用而非值,也就是说,你在询问这两个数组是否是同一个实例,而不是它们是否包含相同的值。
  • 你使用==的事实意味着你可能不知道equals()方法和Object。这并不是解决当前问题所需的方法,但要知道通常情况下,在比较两个对象的值时,应该使用obj1.equals(obj2)而不是obj1 == obj2。现在==与原始类型如int(例如纯旧的x == 3等)一起使用,因此可能是你正在使用它的原因,但我只是想确保你知道equals()==之间的区别。
  • 在旧的旧的日子里(1998年之前),你必须比较两个数组的每个元素对。现在,你可以使用静态的Arrays.equals()方法在java.util.Arrays类上。该方法针对所有基本类型进行了重载(在每个元素对下使用==)以及Object(在每个对下它肯定会使用equals())。

这是一个不错的回答,但问题研究不够充分,并且已经被问过了。为了大家的利益,请在回答之前寻找重复的内容——这将节省您和提问者的时间,避免重复劳动。 - Jeroen Vannevel

2
你可以这样做:
public boolean compareArrays(int[] a, int[] b) {
    boolean check = true;
    if (a!= null && b!= null){
      if (a.length != b.length){
          check= false;
      }else
          for (int i = 0; i < b.length; i++) {
              if (b[i] != a[i]) {
                  check= false;    
              }                 
        }
    }else{
      check= false;
    }
    return check;
}

你可以这样做:
boolean areEqual = Arrays.equals(Arrays.sort(arr1), Arrays.sort(arr2));

2
==运算符对对象(包括数组)进行引用相等性检查。如果数组元素是原始类型(如int),可以使用java.util.Arrays.equals方法。如果它们本身是对象,则java.util.Arrays.deepEquals将执行深度相等性测试(前提是数组中的对象提供了适当的Object#equals覆盖)。

1

If you do this:

if (one == two){

那么你正在比较2个数组的引用而不是它们的内容,这是错误的。
改为:相反要这样做。
Arrays.equals(one, two)

1
你正在比较引用。相反,应该使用以下代码比较内容:Arrays.equals(one, two)

1

== 操作符比较的是在 Java 中继承自 Object 的所有内容的 引用,而不是实际值。这种方法仅适用于基元类型。


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