Por favor, aclare mi duda en Hashset. Considere el siguiente código,Hashcode e igual para Hashset
class Person
{
String name;
Person(String n)
{
name=n;
}
public String getName()
{
return name;
}
@Override
public boolean equals(Object arg0) {
System.out.println("in equals");
Person obj=(Person)arg0;
System.out.println("1st "+getName());
System.out.println("2nd "+obj.getName());
if(this.getName().equals(obj.getName()))
{
return true;
}
return false;
}
@Override
public int hashCode() {
System.out.println("in hash code");
System.out.println(" value is "+Integer.valueOf(name.charAt(0)));
return Integer.valueOf(name.charAt(0));
}
}
en el principal tengo el siguiente código
Person obj1=new Person("bcd");
Person obj2=new Person("cde");
Person obj3=new Person("abc");
Person obj4=new Person("abc");
Ahora si añado estos objetos para hashset
Set<Person> sset=new HashSet<Person>();
sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj3);
estoy recibiendo esta salida
in hash code
value is 98
in hash code
value is 97
in hash code
value is 99
in hash code
value is 97
in equals
1st abc
2nd abc
Pregunta 1: ¿por qué la función igual() se llama solo una vez para verificar obj3 y obj4? ¿Por qué no se verifica para el resto de los objetos?
Pregunta 2: Si la respuesta es porque ambos tienen el mismo código hash, sólo entonces es igual será llamado, entonces ¿por qué no es llamado a continuación Código
sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj4);
salida es:
in hash code
value is 98
in hash code
value is 97
in hash code
value is 99
in hash code
value is 97
No va dentro del método equals() aunque se hayan agregado dos mismos objetos al conjunto de hash que tiene el mismo código hash.
Pregunta 3: He repetido el valor anterior e imprimí el contenido pero no se han llamado ni hashcode ni iguales. cuando es realmente útil para anular el código hash y el método igual?
Pregunta 4: ¿Cuándo se llamará hashCode()
y equals()
?
Mmh ... ¿leo esta pregunta sin formato de código? ... ¿Me formato él mismo para entenderlo? ... no, es tarde , Me voy a casa. N8. – Daniel
@ Paŭlo Ebermann: No modifique el significado de una respuesta cuando edite; se redactó usando "código hash" y no "igual" en 2. intencionalmente. Eres libre de escribir una nueva respuesta si no estás de acuerdo con la mía. – Erik
@Erik: Lo siento, ya que la pregunta era sobre llamar '.equals', pensé que la respuesta debería ser sobre esto también. (Sí, tienes razón, debería haber agregado un comentario). –