La mejor implementación del método hashCode para una colección

Resuelto Omnipotent asked hace 16 años • 20 respuestas

¿Cómo decidimos cuál es la mejor implementación del hashCode()método para una colección (suponiendo que el método igual se haya anulado correctamente)?

Omnipotent avatar Sep 22 '08 13:09 Omnipotent
Aceptado

¿La mejor implementación? Ésta es una pregunta difícil porque depende del patrón de uso.

Para casi todos los casos se propuso una buena implementación razonable en Effective Java de Josh Bloch en el punto 8 (segunda edición). Lo mejor es buscarlo allí porque el autor explica allí por qué el enfoque es bueno.

una versión corta

  1. Cree a int resulty asigne un valor distinto de cero .

  2. Para cada campo f probado en el equals()método, calcule un código hash cmediante:

    • Si el campo f es a boolean: calcular (f ? 0 : 1);
    • Si el campo f es a byte, charo : calcular short;int(int)f
    • Si el campo f es a long: calcular (int)(f ^ (f >>> 32));
    • Si el campo f es a float: calcular Float.floatToIntBits(f);
    • Si el campo f es a double: calcule Double.doubleToLongBits(f)y maneje el valor de retorno como cada valor largo;
    • Si el campo f es un objeto : Utilice el resultado del hashCode()método o 0 si f == null;
    • Si el campo f es una matriz : vea cada campo como un elemento separado y calcule el valor hash de forma recursiva y combine los valores como se describe a continuación.
  3. Combina el valor hash ccon result:

    result = 37 * result + c
    
  4. Devolverresult

Esto debería dar como resultado una distribución adecuada de los valores hash para la mayoría de situaciones de uso.

dmeister avatar Sep 22 '2008 07:09 dmeister

Si está satisfecho con la implementación efectiva de Java recomendada por dmeister, puede usar una llamada a la biblioteca en lugar de implementar la suya propia:

@Override
public int hashCode() {
    return Objects.hash(this.firstName, this.lastName);
}

Esto requiere Guava ( com.google.common.base.Objects.hashCode) o la biblioteca estándar en Java 7 ( java.util.Objects.hash), pero funciona de la misma manera.

bacar avatar Aug 05 '2013 19:08 bacar