我遇到了在一个类中重写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。有谁知道出了什么问题?
答案 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;
}