I really like Java 7+ style of writing hashCode()
method:
@Override
public int hashCode() {
Objects.hash(field1, field2);
}
It doesn't work correctly with arrays though. The following code:
@Override
public int hashCode() {
Objects.hash(field1, field2, array1, array2);
}
will not work, as for array1
and array2
regular hashCode()
instead of Arrays.hashCode()
would be invoked.
How can I use Objects.hash()
with arrays in a proper way?
You could try:
Objects.hash(field1, field2, Arrays.hashCode(array1), Arrays.hashCode(array2));
This is the same as creating one array that contains field1
, field2
, the contents of array1
and the contents of array2
. Then computing Arrays.hashCode
on this array.
Arrays.deepHashCode
will discover arrays in the array (via instanceof Object[]
) and recursively call itself.
See the 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);
}
It would be useful to have a params version like Objects.hash
, but you'd have to write your own:
public final class HashUtils {
private HashUtils(){}
public static int deepHashCode(Object... fields) {
return Arrays.deepHashCode(fields);
}
}
Usage:
@Override
public int hashCode() {
return HashUtils.deepHashCode(field1, field2, array1, array2);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With