2012-02-17 29 views
7

Aparece en java.lang.String.java, que Java solo generará el código hash, y luego lo almacenará, después de una llamada a hashcode(), pero ¿por qué no simplemente hacer el código hash en el constructor?¿Por qué se genera un código hash de Java String?

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; 
} 

podría en su mayor parte se colocará en el constructor.

+0

Si encuentra una respuesta aceptable, puede marcarla para que la gente sepa que tiene una respuesta a su pregunta. –

Respuesta

13

¿Por qué perder tiempo generando un código hash que muy probablemente no se utilizará? La mayoría de las cadenas se construyen, se usan y luego se recolectan los desechos sin que se llame al hashcode().

+0

Muchas cuerdas obtendrán un control de igualdad durante su vida útil. Comprobar dos cadenas desiguales para la igualdad si se han calculado sus códigos hash es generalmente muy rápido. Además, para algunas implementaciones de código hash, incluida la de Java, es posible calcular el código hash para la concatenación de dos cadenas en tiempo constante (en realidad, tiempo O (lgN), pero esa cantidad está limitada y el término constante puede ser bastante pequeño) – supercat

0

Este no es realmente el foro correcto para esto y la pregunta probablemente se cerrará. Puedes intentar preguntar en programmers.stackexchange.com.

Una razón podría ser que la computación hashCode no es barata y solo se requiere en algunos casos.

4

Joshua Bloch llama a esta práctica 'simple comprobación con poca gracia'.

Jeremy Manson tiene una excelente explicación de por qué se hace y qué it'safe: on his blog

En esencia, en el momento de la construcción a ahorrar algo de tiempo al omitir el cálculo de código hash. En el entorno multiproceso, pagará esto porque múltiples subprocesos podrían hacer el mismo cálculo.

0

2 razones:

1) Informática hashCode() no es barato: es un O(n) complejidad de la longitud de la cadena, así que mejor lo hacen sólo cuando lo necesita.

y:

2) instancias de String son inmutables: Dado que nunca cambian, siempre se computa hashCode() a lo sumo una vez.

0

No hay ningún beneficio al colocarlo en el constructor. Pero hay un inconveniente cuando estaría en el constructor. Cuando nunca se llama a hashCode for a String, el cálculo se realizó para nada. Y cuando llama a hashCode(), entonces se calcula una vez en ambos casos, solo en diferentes lugares y tiempo.

Cuestiones relacionadas