aquí está mi código:HashSet contiene método, extraño comportamiento
public class testGui {
public static void main(String[] arg){
class TESTS{
String t;
public TESTS(String t){
this.t = t;
}
@Override
public boolean equals(Object x){
System.out.println("My method is called...");
if(x instanceof TESTS){
TESTS zzz = (TESTS) x;
return zzz.t.compareTo(t)==0;
}
else return false;
}
}
HashSet<TESTS> allItems = new HashSet<TESTS>();
allItems.add(new TESTS("a"));
allItems.add(new TESTS("a"));
System.out.println(allItems.contains(new TESTS("a")));
}
}
que no entiendo por qué el hashset contiene método no está llamando mi método es igual como lo mencionan en sus especificaciones:
Más formalmente , añade el elemento especificado, o, a este conjunto Si este conjunto contiene ningún elemento electrónico que tales (o == null e == null:? o.equals (e))
Mi código devuelve falso y no entra en mi método equals.
¡Muchas gracias por responder!
No se considerarán desiguales. Es solo que el HashSet ni siquiera invocará el método equals porque solo lo hace para los hashCodes que conducen al mismo cubo. Y reemplazando solo hashCode no tiene ningún sentido, ya que HashSet siempre llamará a iguales para objetos que tengan los mismos hashCodes. –
@JB, sí, el hecho de que conducen a diferentes cubos significa que se consideran 'desiguales' (considerados objetos diferentes). No me refiero al método 'iguales' cuando uso ese término. También acepto sobrescribir solo 'hashCode' es ilógico, por lo que recomiendo encarecidamente que no lo haga. Sin embargo, no rompe el contrato. –
Sería bueno si la documentación de java menciona que hashcode se llama primero. Acabo de quemarme con este problema en java 5. – Aaron