Acerca de código hash

En primer lugar, ¿por qué la necesidad de código hash

  existe el código hash, con el fin de consulta de manera más eficiente. En algunos contenedores de hash, si se quiere determinar si o consulta de algunos de los objetos en el contenedor, es necesario el uso de los iguales () comparación constante, pero por una cantidad ligeramente mayor de datos cuando es muy lento,

   En este caso, podemos simplificar el proceso, cada objeto tiene un código hash correspondiente, código hash primero determina si la hay, con la premisa de los iguales de presencia (comparación). Por lo tanto, se puede trabajar de forma más eficiente. En uso hecho de la tabla hash, código hash como una clave, como un valor objetivo, dada de una manera de almacenar clave
de la misma ilustrada como sigue
Aquí Insertar imagen Descripción

  disposiciones de hash son iguales código hash, un valor hash que es igual a dos pares de valores clave. Sin embargo los valores de hash son iguales, no necesariamente dibujan pares de valores clave son iguales. (Añadido:. Dos pares de valores clave diferentes, valor hash igual, que es la colisión hash)

  Por lo que atraería estados: dos objetos por método equals () cuando se comparan iguales, entonces sus valores hashCode también deben garantizar la igualdad ( esto también se reescribe los iguales (), hashCode necesidad de anulación (en) razones ), pero la misma atención hashCode, iguales pueden no ser iguales

Dos, objeto de equals () y hashCode ()

1, es igual a () Fuente:

public boolean equals(Object obj) {
        return (this == obj);
    }

2, hashCode () el código fuente
  para el objeto es un método hashCode nativo, ver implementado, hashCode dijo anotación es un valor devuelto por la conversión de direcciones de almacenamiento de objetos obtenidos, y almacenamiento de objetos código hash dirección de correspondencia.
Supongamos que definimos una estudiante de la clase

        student  s1= new student("李明");
        student  s2= new student("李明");

   Incluso si estos dos objetos del mismo contenido, pero diferentes direcciones de tiendas, código hash también debe ser diferente, que cumple con los requisitos

Tres, es igual a () y hashCode () reescritura

En la clase de cadena es igual a () y hashCode Ejemplo de código ()

1, es igual a () Fuente:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

    Visto, dirección de retorno no son ciertas simultáneamente, mientras que el contenido de fase devuelve verdadero, entonces el hashCode correspondiente () también reescrito

2, hashCode () Código

  public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;
        for (int i = 0; i < value.length; i++) {
             h = 31 * h + val[i];
           //注意:根据string串内容转化hash
        }
        hash = h;
        //目的为再次碰到可直接输出hashcode
    }
    return h;
}

  Esta reescritura, siempre y cuando ambos contenido de la cadena cadenas, la misma que la que corresponde el código hash, satisface una predeterminada

En tercer lugar, reescribir iguales () sin tener que reescribir hasCode () consecuencias

  Supongamos que hemos creado una buena clase de los estudiantes, los iguales de anulación (en) es igual al contenido que es lo mismo, ejecute el código de abajo

public class HashMapTest {

    public static void main(String[] args) {
        HashMap<Student, String> map = new HashMap<Student, String>();
        // 这里key为new一个对象
        map.put(new student("李明"), "1");
        String s = map.get( new student("李明"));
        System.out.println(s);
    }

Resultados de operación es nula, y creemos que debería ser capaz de encontrar una

  Esta es la razón, ya que acabamos de volver a escribir el signo igual (), no es hashCode () sustituido, por lo que el estudiante objetos para generar código hash método es un método en el objeto, código hash se transforma de la dirección, y la nueva de cada dos dos objetos diferentes, se obtiene un resultado tal, por lo que necesitamos hashCode anulación () puede resolver este problema.

  En general, si no se utiliza el contenedor de hash, como un mapa, etc., es igual a () y hashCode () no importa, pero si se utiliza un recipiente de hash, es necesario prestar atención a los iguales de clases personalizadas () y hashCode ()

Publicado siete artículos originales · ganado elogios 5 · Vistas 230

Supongo que te gusta

Origin blog.csdn.net/qq_43646059/article/details/104732275
Recomendado
Clasificación