Я обычно не кодирую на Java, но в последнее время у меня не было выбора. Возможно, у меня возникло серьезное непонимание того, как правильно использовать HashSet. Таким образом, возможно, что-то, что я сделал, просто неправильно. Однако я благодарен за любую помощь, которую вы могли бы предложить. Итак, актуальная проблема:
В небольшой программе, которую я писал, я генерировал очень похожие объекты, которые при создании имели бы очень специфический id (a string
или в моей последней итерации a long
). Поскольку каждый объект создавал новые объекты, я хотел отфильтровать все те, что я уже создал. Поэтому я начал бросать id каждого нового объекта в свой 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)
Любые идеи или предложения?