Best implementation for hashCode method for a collection Best implementation for hashCode method for a collection java java

Best implementation for hashCode method for a collection


The best implementation? That is a hard question because it depends on the usage pattern.

A for nearly all cases reasonable good implementation was proposed in Josh Bloch's Effective Java in Item 8 (second edition). The best thing is to look it up there because the author explains there why the approach is good.

A short version

  1. Create a int result and assign a non-zero value.

  2. For every field f tested in the equals() method, calculate a hash code c by:

    • If the field f is a boolean: calculate (f ? 0 : 1);
    • If the field f is a byte, char, short or int: calculate (int)f;
    • If the field f is a long: calculate (int)(f ^ (f >>> 32));
    • If the field f is a float: calculate Float.floatToIntBits(f);
    • If the field f is a double: calculate Double.doubleToLongBits(f) and handle the return value like every long value;
    • If the field f is an object: Use the result of the hashCode() method or 0 if f == null;
    • If the field f is an array: see every field as separate element and calculate the hash value in a recursive fashion and combine the values as described next.
  3. Combine the hash value c with result:

    result = 37 * result + c
  4. Return result

This should result in a proper distribution of hash values for most use situations.


If you're happy with the Effective Java implementation recommended by dmeister, you can use a library call instead of rolling your own:

@Overridepublic int hashCode() {    return Objects.hashCode(this.firstName, this.lastName);}

This requires either Guava (com.google.common.base.Objects.hashCode) or the standard library in Java 7 (java.util.Objects.hash) but works the same way.


It is better to use the functionality provided by Eclipse which does a pretty good job and you can put your efforts and energy in developing the business logic.