【问题标题】:How to compare Object Arrays using Arrays.equals() in java?如何在 java 中使用 Arrays.equals() 比较对象数组?
【发布时间】:2017-01-29 03:27:05
【问题描述】:

在这个例子中展示了如何做到这一点:

Student[] stud1 = new Student[2];
Student[] stud2 = new Student[2];
Student[] stud3 = new Student[2];
boolean b;
stud1[0]= new Student("Johnny","Bravo");
stud1[1]= new Student("Ace","Ventura");
stud2[0]= new Student("Ash","Ketchum");
stud2[1]= new Student("Mike","Wazowski");
b = Arrays.equals(stud1,stud2);
System.out.println(b);
stud2 [0] = stud1[0];
stud2[1] = stud1[1];
b = Arrays.equals(stud1,stud2);
System.out.println(b); 
stud3 = stud1;
b = Arrays.equals(stud1,stud3);
System.out.println(b);
}

结果是假真真。 Arrays.equals 到底比较的是什么? 谢谢。

【问题讨论】:

  • 什么是 Arrays.equals 的精确比较? 它检查元素之间的相等性,由 Object.equals() 定义。你对某些特定的事情感到惊讶吗?
  • 这里的元素是对象;是比较参考 stud1[0] 与 stud2[0] 和 stud2[0] 与 stud2[1] 还是比较里面的内容(“Johnny”、“Bravo”与“Ash”、“Ketchum”....)
  • 它正在使用Object.equals()。如果您覆盖了该方法,它将使用您的实现。否则,它会检查身份或引用相等性。

标签: java arrays oop object


【解决方案1】:

直接来自the docs

如果Objects 的两个指定数组彼此相等,则返回true。如果两个数组包含相同数量的元素,并且两个数组中所有对应的元素对相等,则认为这两个数组相等。如果(e1==null ? e2==null : e1.equals(e2)),则两个对象e1e2 被认为是相等的。换句话说,如果两个数组以相同的顺序包含相同的元素,则它们是相等的。此外,如果两个数组引用都是null,则认为两个数组引用相等。

这几乎解释了一切。在您的情况下,第一个输出是false,因为stud1stud2Student 实例不相等。在第二种情况下,两个数组具有相同的对象,因此测试为相等。在第三种情况下,stud1stud3 是同一个对象,因此也相等。

唯一有趣的情况是如果Student 有一个equals() 方法,并且您想测试两个具有等效但不相同的Student 对象的数组:

Student[] stud1 = {
    new Student("Johnny","Bravo")
};
Student[] stud2 = {
    new Student("Johnny","Bravo")
};
System.out.println(Arrays.equals(stud1, stud2));

这里的输出将取决于Student.equals() 的实现。

【讨论】:

  • 另外,作为旁注:记得在 Student 类上覆盖 equals。在您的代码 sn-p 中它不会产生影响,但总的来说,Array.equals 按预期工作很重要。
【解决方案2】:

array1.equals(array2)array1 == array2 相同,即它是同一个数组。

Arrays.equals(array1, array2) 比较数组的内容。

【讨论】:

    【解决方案3】:

    根据Arrays类的equals方法的javadoc:

    如果两个指定的 Objects 数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中所有对应的元素对相等,则认为这两个数组相等。两个对象 e1 和 e2 被认为是相等的,如果

      (e1==null ? e2==null : e1.equals(e2)).  
    

    换句话说,如果两个数组以相同的顺序包含相同的元素,则它们是相等的。此外,如果两个数组引用都为空,则认为两个数组引用相等。

    数组中的元素是“java.lang.String”,因此您还应该查看 Strings equal 方法,它说,

    将此字符串与指定对象进行比较。当且仅当参数不为 null 并且是表示与此对象相同的字符序列的 String 对象时,结果才为真。

    【讨论】:

    • 所有粗体字让您的答案难以阅读。考虑改用块引用标记,以 > 开头的段落。
    • OP 数组的元素是Student 的实例,而不是String 的实例。
    • 感谢@VGR 的提示。
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多