Pregunta

Aparece en java.lang.string.java, que Java solo generará el hashcode, y luego lo almacenará, después de una llamada a hashcode (), pero ¿por qué no hacer el hashcode en el constructor?

El código relevante:

if (h == 0 && count > 0) {
    int off = offset;
    char val[] = value;
    int len = count;

    for (int i = 0; i < len; i++) {
        h = 31*h + val[off++];
    }

    hash = h;
}

en su mayor parte podría colocarse en el constructor.

¿Fue útil?

Solución

¿Por qué pasar tiempo generando un código hash que probablemente no se use? La mayoría de las cuerdas se construyen, usan y luego se recolectan basura sin que se llame el hashcode ().

Otros consejos

Joshua Bloch llame a esta práctica 'check racy individual'.

Jeremy Manson tiene una excelente explicación de por qué se hace y por qué es una seguridad: En su blog

En esencia, en el momento de la construcción ahorra algo de tiempo saltando calculando el código hash. En el entorno multiproceso, pagará por esto porque múltiples hilos potencialmente podrían hacer el mismo cálculo.

Este no es realmente el foro correcto para esto y es probable que la pregunta esté cerrada. Puede intentar preguntar en programadores.stackexchange.com.

Una razón podría ser que calcular el hashcode no es barato y que solo se requiere en algunos casos.

2 razones:

1) Computación hashCode() no es barato: es un O(n) Complejidad en la longitud de la cadena, así que mejor hágalo solo cuando la necesite.

y:

2) Las instancias de cadena son inmutables: dado que nunca cambian, siempre calculas hashCode() como máximo en un momento.

No hay ningún beneficio al colocarlo en el constructor. Pero hay un inconveniente cuando estaría en el constructor. Cuando el hashcode para una cadena nunca se llama, el cálculo se hizo por nada. Y cuando llama HashCode (), se calcula una vez en ambos casos, solo en diferentes lugares y tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top