hashCode()在Java中调用数组实例

时间:2014-06-24 11:34:45

标签: java arrays hashcode

我只是在编写代码,突然间我在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,但他们没有提到这一点。

4 个答案:

答案 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,因此从其继承方法equalshashCode

默认的equals方法比较对象标识(即两个引用是否引用相同的对象),默认的hashCode方法很可能会为不同的方法返回不同的值对象。

在大多数情况下,这是您不想要的行为。您可能希望根据内容比较数组。请注意,您的equals方法似乎这样做,这反过来意味着您的hashCode方法已被破坏。查看method's documentation的原因。

Java提供了一个带有辅助方法的类,正是出于这个原因:java.util.Arrays。它提供了基于数组内容的方法equalshashCode

所以你应该这样写:

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方法。