我只是在编写代码,突然间我在Netbeans中遇到了这个警告:
hashCode()
调用数组实例
它发生在这段代码中:
public class SomeObject {
private String a;
private char[] b;
@Override
public boolean equals(Object anotherObject) {
if (!(anotherObject instanceof SomeObject)) {
return false;
}
SomeObject object = (SomeObject) anotherObject;
return (this.a.equals(object.a) && arraysAreEqual(this.b, object.b));
}
// When I created the equals() method, Netbeans warned me:
// 'Generate missing hashCode()'. Okay then, here it comes:
@Override
public int hashCode() {
return (43 * this.a.hashCode() + 11 * this.b.hashCode()); // MARKED LINE.
}
}
警告发生在标记的行上。 IDE发现我应该避免在数组实例上调用hashCode()
。
现在我为什么要避免在数组上使用hashCode()
?
请注意,我读过this question and answer,但他们没有提到这一点。
答案 0 :(得分:2)
我最好使用:
java.utils.Arrays.hashCode(char[] a)
http://www.tutorialspoint.com/java/util/arrays_hashcode_char.htm
以你的方式,你没有测试char数组的内容。
java.util.Arrays.hashCode(char [])方法返回基于哈希的代码 在指定数组的内容上。对于任何两个char数组a和 b使得Arrays.equals(a,b),情况也是如此 Arrays.hashCode(a)== Arrays.hashCode(b)。
public void testHashCode() {
char[] b = { 'a', 'b' };
char[] a = { 'a', 'b' };
System.out.println("HashCode b:" + b.hashCode() + " a:" + a.hashCode());
System.out.println("Array hashCode a:" + java.util.Arrays.hashCode(a) + " b:" + java.util.Arrays.hashCode(b));
}
结果:
HashCode b:8995841 a:8995844
Array hashCode a:4066 b:4066
希望这有帮助!
答案 1 :(得分:2)
Java数组直接派生自java.lang.Object
,因此从其继承方法equals
和hashCode
。
默认的equals
方法比较对象标识(即两个引用是否引用相同的对象),默认的hashCode
方法很可能会为不同的方法返回不同的值对象。
在大多数情况下,这是您不想要的行为。您可能希望根据内容比较数组。请注意,您的equals
方法似乎这样做,这反过来意味着您的hashCode
方法已被破坏。查看method's documentation的原因。
Java提供了一个带有辅助方法的类,正是出于这个原因:java.util.Arrays
。它提供了基于数组内容的方法equals
和hashCode
。
所以你应该这样写:
public class SomeObject {
private String a;
private char[] b;
@Override
public boolean equals(Object anotherObject) {
if (!(anotherObject instanceof SomeObject)) {
return false;
}
SomeObject object = (SomeObject) anotherObject;
return (this.a.equals(object.a) && Arrays.equals(this.b, object.b));
}
@Override
public int hashCode() {
return (43 * this.a.hashCode() + 11 * Arrays.hashCode(this.b));
}
}
答案 2 :(得分:0)
问题是您无法覆盖array
,并且它正在使用可能导致问题的默认hashCode()
实施。您可以将此视为设计监督。您应该将array
包裹在任意对象中,或者在hashCode()
s的上下文中完全不使用array
。
答案 3 :(得分:0)
数组的hashCode
实现基于数组的标识而不是内容。在大多数情况下,这不是您想要的,因为具有相同内容的两个数组通常具有不同的哈希码。
要将哈希码基于数组内容,您可以使用java.utils.Arrays.hashCode
方法。