Обычно я не пишу код на Java, но недавно у меня не было выбора. У меня может быть серьезное недопонимание того, как правильно использовать HashSet. Так что, возможно, что-то, что я сделал, просто неправильно. Однако я благодарен за любую помощь, вы можете предложить. Итак актуальная проблема:
В небольшой программе, которую я писал, я генерировал очень похожие объекты, которые при создании имели бы очень специфический идентификатор (a string
или в моей последней итерации a long
). Поскольку каждый объект порождал новые объекты, я хотел отфильтровать все, что я уже создал. Поэтому я начал добавлять идентификатор каждого нового объекта в мой Hash (Set) и проверять с помощью HashSet.contains()
, был ли объект создан ранее. Вот полный код:
// hashtest.java
import java.util.HashSet;
class L {
public long l;
public L(long l) {
this.l = l;
}
public int hashCode() {
return (int)this.l;
}
public boolean equals(L other) {
return (int)this.l == (int)other.l;
}
}
class hashtest {
public static void main(String args[]) {
HashSet<L> hash = new HashSet<L>();
L a = new L(2);
L b = new L(2);
hash.add(a);
System.out.println(hash.contains(a));
System.out.println(hash.contains(b));
System.out.println(a.equals(b));
System.out.println(a.hashCode() == b.hashCode());
}
}
производит следующий вывод:
true
false
true
true
очевидно, что contains
не использует функцию equals
, предоставленную L
, или у меня есть серьезное недопонимание концепции ...
Я протестировал его с openjdk (текущая версия включена в Ubuntu) и официальной текущей Java от Oracle на Win7
для полноты официальной документации Java-API для HashSet.contains()
:
public boolean contains(Object o)
Возвращает true
, если этот набор содержит
указанный элемент. Более формально,
возвращает true
тогда и только тогда, когда этот набор
содержит элемент e
такой, что
(o==null ? e==null : o.equals(e))
.
http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html#contains(java.lang.Object)
Есть идеи или предложения?