La mejor implementación del método hashCode para una colección
¿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)?
¿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
Cree a
int result
y asigne un valor distinto de cero .Para cada campo
f
probado en elequals()
método, calcule un código hashc
mediante:- Si el campo f es a
boolean
: calcular(f ? 0 : 1)
; - Si el campo f es a
byte
,char
o : calcularshort
;int
(int)f
- Si el campo f es a
long
: calcular(int)(f ^ (f >>> 32))
; - Si el campo f es a
float
: calcularFloat.floatToIntBits(f)
; - Si el campo f es a
double
: calculeDouble.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 sif == 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.
- Si el campo f es a
Combina el valor hash
c
conresult
:result = 37 * result + c
Devolver
result
Esto debería dar como resultado una distribución adecuada de los valores hash para la mayoría de situaciones de uso.
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.