Equals方法总是返回真正的JAVA

时间:2014-09-19 02:22:15

标签: java arrays equals hashcode

我遇到了在一个类中重写equals方法的问题,这个类只有一个属性,它是一个名为grid的二维数组。这是构造函数:

public World(int n, int m){
    this.grid = new Object[n][m];
}

等于方法:

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (null == obj)
        return false;
    if ( !obj instanceof World)
        return false;
    World other = (World) obj;
    if ( !Arrays.deepEquals(grid, other.grid))
        return false;
    return true;
}

我已经覆盖了hashCode()方法,但问题是无关紧要,等于总是返回true。有谁知道出了什么问题?

2 个答案:

答案 0 :(得分:4)

小心 - 你在这里弄乱Object

无论您放入该数组的实际对象如何,它们都将使用Object#equals进行比较。原因lies in the documentation of Arrays#deepEquals

  

如果满足以下任何条件,则两个可能为空的元素e1和e2非常相等:

     
      
  • e1和e2都是对象引用类型的数组,而Arrays.deepEquals(e1,e2)将返回true
  •   
  • e1和e2是相同基元类型的数组,Arrays.equals(e1,e2)的相应重载将返回true。
  •   
  • e1 == e2
  •   
  • e1.equals(e2)将返回true。
  •   

然后......猜猜Object#equals做了什么:

public boolean equals(Object obj) {
    return (this == obj);
}

当且只有当数组中包含 完全相同的 之类的内容时,永远才会等效。

在数组周围应用更严格的类型(例如具体类)可以帮助您解决问题。我们不知道您在该阵列中存储了什么,因此我无法提出具体的建议,但希望远离Object

答案 1 :(得分:0)

试试这个 -

public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (!(obj instanceof World)) {
        return false;
    } 
    World other = (World) obj;
    if (!Arrays.deepEquals(this.grid, other.grid))
        return false;      
    return true;
}