如何对数组使用 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);
}
将不起作用,至于 array1
和 array2
将调用常规 hashCode()
而不是 Arrays.hashCode()
。
如何以正确的方式将 Objects.hash()
与数组一起使用?
你可以试试:
Objects.hash(field1, field2, Arrays.hashCode(array1), Arrays.hashCode(array2));
这与创建一个包含 field1
、field2
、array1
的内容和 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);
}
很喜欢Java7+文笔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()
与数组一起使用?
你可以试试:
Objects.hash(field1, field2, Arrays.hashCode(array1), Arrays.hashCode(array2));
这与创建一个包含 field1
、field2
、array1
的内容和 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);
}