如何对数组使用 Java 7+ 'Objects.hash()'?

How to use Java 7+ 'Objects.hash()' with arrays?

很喜欢Java7+文笔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() 与数组一起使用?

你可以试试:

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

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

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

If the array contains other arrays as elements, the hash code is based on their contents and so on, ad infinitum.

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

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

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);
}