2011-07-14 21 views
8

Recientemente asistí a una entrevista y me hicieron la siguiente pregunta.Pregunta de la entrevista en java hashcode()

Hay dos objetos con el mismo hashcode. Estoy insertando estos dos objetos dentro de un hashmap.

hMap.put(a,a); hMap.put(b,b);

donde a.hashCode()==b.hashCode()

Ahora dime cuántos objetos estarán allí dentro de la HashMap?

Respondí que solo habrá un objeto, ya que los códigos hash son iguales, los dos objetos serán iguales y hashmap no permitirá las claves duplicadas. Por favor dime si mi entendimiento es correcto o no?

+5

No puede responder a la pregunta sin saber si 'a.equals (b)' por lo que esta debería ser su respuesta. – Qwerky

+0

Depende del tipo de elemento y cómo se implementa hashCode. Imagina un mapa de cadenas. Solo hay 2^32 códigos hash diferentes, pero un * lote * más valores de cadena posibles. Por lo tanto, es imposible que cada valor de cadena tenga un código hash único. – fredoverflow

Respuesta

32

Puede haber dos elementos diferentes con el mismo código hash. Entonces tu respuesta es incorrecta. Lo único garantizado es que si dos elementos tienen códigos hash diferentes, entonces son diferentes. Cuando dos elementos tienen el mismo código hash entonces Java usa los iguales para una mayor diferenciación.

Entonces la respuesta es uno o dos objetos.

+1

@Lectores - consulte el [código fuente de HashMap.put (K, V)] (http : //www.docjar.com/html/api/java/util/HashMap.java.html) para evidencia. +1 por la respuesta. – Matyas

1

Habrá dos objetos en el hashmap, porque no son equals().

Aquí está la prueba:

public static void main(String[] args) { 
    Object a = new Object() { 
     public int hashCode() { 
      return 1; 
     } 
    }; 

    Object b = new Object() { 
     public int hashCode() { 
      return 1; 
     } 
    }; 

    Map<Object, Object> map = new HashMap<Object, Object>(); 
    map.put(a, a); 
    map.put(b, b); 
    System.out.println(map.size()); 
} 

Salida:

2 

Si añado un método equals() así:

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

Salida:

1 

Según el Javadoc para Object.equals():

Tenga en cuenta que en general es necesario reemplazar el método hashCode cada vez que se anula este método, a fin de mantener el contrato general para el método hashCode, que establece que objetos iguales debe tener códigos hash iguales

Esto no obstante quiere decir que dos objetos que no son equals() no pueden compartir el mismo código hash.

+2

Esto no es correcto. Puede haber dos objetos diferentes con el mismo código hash. –

+1

Esto es incorrecto. El método 'igual' se usa para determinar la identidad del objeto en' HashMaps'. –

+1

@Bohemian - Una vez más no perfectamente correcto. No sabes el resultado de los iguales. Puede ser anulado y luego no comparará las referencias. –

3

Habrá uno o dos objetos en el hashmap.

Si los dos objetos no son iguales, es decir, !a.equals(b), ambos se almacenarán.

2

No, el hashCode es una búsqueda inicial de la eficiencia, pero a menos a.equals(b)==true habrá dos entradas

0

Hay uno o dos objetos clave en función de a.equals (b), y, o bien uno o dos valor objetos que dependen de a == b.

Cuestiones relacionadas