2011-06-28 9 views
6

¿Puede alguien explicar por qué se llama hashCode en el ejemplo a continuación?¿Por qué se llama a hashcode en este ejemplo?

import java.util.List; 

public class JSSTest extends Object{ 

    public static void main(String args[]){ 

     JSSTest a = new JSSTest(); 
     JSSTest b = new JSSTest(); 
     List<JSSTest> list = new java.util.ArrayList<JSSTest>(); 
     list.add(a); 
     list.add(b); 
     System.out.println(list.get(0)); 
     System.out.println(list.get(1)); 
    } 

    @Override 
    public boolean equals(Object obj){ 
     System.out.println("equals"); 
     return false; 
    } 

    @Override 
    public int hashCode(){ 
     System.out.println("hashCode"); 
     return super.hashCode(); 
    } 
} 

Resultado:

hashCode 0 
[email protected] 
hashCode 0 
[email protected] 
+1

¿Ha intentado tomar un seguimiento de pila o agregar un punto de interrupción en línea en un depurador? –

+2

Sería una gran pista mirar el número '1bab50a' o' c3c749' y ver cómo se compara con el código hash del objeto. –

Respuesta

15

La implementación predeterminada toString() llama al hashCode. Esto no tiene nada que ver con las listas.

Aquí hay una repro bastante mínima:

public class JSSTest { 

    public static void main(String args[]){ 
     JSSTest test = new JSSTest(); 
     // Just to show it's not part of creation... 
     System.out.println("After object creation"); 
     test.toString(); 
    } 

    @Override 
    public boolean equals(Object obj){ 
     System.out.println("equals"); 
     return false; 
    } 

    @Override 
    public int hashCode(){ 
     System.out.println("hashCode"); 
     return super.hashCode(); 
    } 
} 

(Usted podría anular toString() para mostrar antes de la llamada de/super/después de detalles, también.)

Está documentado en Object.toString():

El método toString para la clase Object devuelve una cadena que consiste en el nombre de la clase de la cual el objeto es una instancia, el carácter al firmar `@ ', y el unsigned he Representación xadecimal del código hash del objeto. En otras palabras, este método devuelve una cadena igual al valor de:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 
7
System.out.println(list.get(0)); 

Creo que es parte del método Object.toString() que todos los objetos tienen menos que lo sustituya toString() en su propia clase. Prueba eso y mira.

+0

Thx. Eso es correcto también, pero solo puede marcar una respuesta correcta. Dado tu tickup :) – JSS

6

porque la implementación toString() en Object llama ..

public String toString() { 
    return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
    } 

sobrescritura toString, y no será llamado

+0

Thx. Eso es correcto también, pero solo puede marcar una respuesta correcta. Dado que tickup :) – JSS

Cuestiones relacionadas