вот мой код:HashSet содержит метод, странное поведение
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")));
}
}
Я не понимаю, почему HashSet содержит метод не называя мой метод Equals, как упоминалось в их спецификации:
Более формально , добавляет указанный элемент, а, к этому набору, если этот набор не содержит элемент е такой, что (о == NULL е == NULL:? o.equals (е))
Мой код возвращает false и не входит в мой метод equals.
Большое спасибо за ответ!
Они не будут считаться неравными. Просто HashSet даже не вызывает метод equals, потому что он делает это только для хэш-кодов, ведущих к одному и тому же ведро. И переопределение только hashCode не имеет никакого смысла, так как HashSet всегда будет называть равным для объектов, имеющих одинаковые хэш-коды. –
@ JB, да, тот факт, что они приводят к разным ведрам, означает, что они считаются «неравными» (считаются разными объектами). Я не имею в виду метод «equals», когда я использую этот термин. Я также соглашаюсь, что переопределение только «hashCode» нелогично, поэтому я настоятельно рекомендовал его. Однако он не нарушает контракт. –
Было бы неплохо, если бы в java-документации упоминалось, что hashcode вызывается первым. Я просто сожгла эту проблему в java 5. – Aaron