如何在阵列中使用Java 7+'Objects.hash()'?

时间:2015-05-21 21:53:16

标签: java arrays java-7 hashcode

我非常喜欢Java 7+写作hashCode()方法的风格:

@Override
public int hashCode() {
    Objects.hash(field1, field2);
}

但它无法正常使用数组。以下代码:

@Override
public int hashCode() {
    Objects.hash(field1, field2, array1, array2);
}

不起作用,因为array1array2会调用常规hashCode()而不是Arrays.hashCode()

如何以正确的方式使用Objects.hash()数组?

2 个答案:

答案 0 :(得分:7)

你可以尝试:

Objects.hash(field1, field2, Arrays.hashCode(array1), Arrays.hashCode(array2));

这与创建一个包含field1field2array1的内容和array2的内容的数组相同。然后在这个数组上计算Arrays.hashCode

答案 1 :(得分:6)

Arrays.deepHashCode将发现数组中的数组(通过instanceof Object[])并递归调用自身。 请参阅code

  

如果数组包含其他数组作为元素,则哈希码基于其内容等等,无限制地。

@Override
public int hashCode() {
    Object[] fields = {field1, field2, array1, array2};
    return Arrays.deepHashCode(fields);
}

拥有像Objects.hash这样的params版本会很有用,但你必须自己编写:

public final class HashUtils {
    private HashUtils(){}

    public static int deepHashCode(Object... fields) {
        return Arrays.deepHashCode(fields);
    }
}

用法:

@Override
public int hashCode() {
    return HashUtils.deepHashCode(field1, field2, array1, array2);
}