Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Java 7+ 'Objects.hash()' with arrays?

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?

like image 734
Michal Kordas Avatar asked May 21 '15 21:05

Michal Kordas


2 Answers

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.

like image 82
Benjy Kessler Avatar answered Sep 27 '22 17:09

Benjy Kessler


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);
}
like image 37
weston Avatar answered Sep 27 '22 18:09

weston