如何将 Java 7+ 'Objects.hash()' 与数组一起使用?

2022-09-04 19:51:06

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

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

但是,它不能与数组一起正常工作。下面的代码:

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

将不起作用,因为和常规而不是将被调用。array1array2hashCode()Arrays.hashCode()

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


答案 1

您可以尝试:

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

这与创建一个包含 、 、 和 的内容的数组相同。然后在此阵列上进行计算。field1field2array1array2Arrays.hashCode


答案 2

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

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

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