我非常喜欢Java 7+写作hashCode()
方法的风格:
@Override
public int hashCode() {
Objects.hash(field1, field2);
}
但它无法正常使用数组。以下代码:
@Override
public int hashCode() {
Objects.hash(field1, field2, array1, array2);
}
不起作用,因为array1
和array2
会调用常规hashCode()
而不是Arrays.hashCode()
。
如何以正确的方式使用Objects.hash()
数组?
答案 0 :(得分:7)
你可以尝试:
Objects.hash(field1, field2, Arrays.hashCode(array1), Arrays.hashCode(array2));
这与创建一个包含field1
,field2
,array1
的内容和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);
}