如何使用Java 7+中的'Objects.hash()'处理数组?

13

我真的很喜欢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
你可能需要使用 Arrays.deepHashCode - Louis Wasserman
1
@LouisWasserman - 你能详细解释一下为什么我需要使用深度哈希码吗? - Michal Kordas
2个回答

13

您可以尝试:

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

这等同于创建一个包含field1field2array1array2内容的数组。然后对该数组执行Arrays.hashCode计算。


7

Arrays.deepHashCode将通过instanceof Object[]发现数组以及递归调用自身。 请参见代码

如果数组包含其他数组作为元素,则哈希码基于它们的内容,以此类推,无穷尽。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接