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

Mic*_*das 10 java arrays hashcode java-7

我非常喜欢Java 7+写作hashCode()方式:

@Override
public int hashCode() {
    Objects.hash(field1, field2);
}
Run Code Online (Sandbox Code Playgroud)

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

@Override
public int hashCode() {
    Objects.hash(field1, field2, array1, array2);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*ler 8

你可以尝试:

Objects.hash(field1, field2, Arrays.hashCode(array1), Arrays.hashCode(array2));
Run Code Online (Sandbox Code Playgroud)

这是相同的创建包含一个阵列field1,field2,的内容array1和内容array2.然后计算Arrays.hashCode这个数组.


wes*_*ton 6

Arrays.deepHashCode将发现数组中的数组(via instanceof Object[])并递归调用自身.看代码.

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

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

有一个params版本会很有用Objects.hash,但是你必须自己编写:

public final class HashUtils {
    private HashUtils(){}

    public static int deepHashCode(Object... fields) {
        return Arrays.deepHashCode(fields);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

@Override
public int hashCode() {
    return HashUtils.deepHashCode(field1, field2, array1, array2);
}
Run Code Online (Sandbox Code Playgroud)