【发布时间】:2011-05-06 04:24:56
【问题描述】:
我通常不使用 Java 编写代码,但最近我开始别无选择。我可能对如何正确使用 HashSet 有一些重大误解。因此,我所做的事情可能完全是错误的。但是,我很感谢您提供的任何帮助。所以实际的问题:
在我编写的一个小程序中,我生成了非常相似的对象,这些对象在创建时将具有非常特定的 id(string 或在我的上一次迭代中为 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 没有使用L 提供的equals 功能,或者我对这个概念有一些重大误解......
我用openjdk(ubuntu中包含的当前版本)和Win7上的Oracle官方当前java对其进行了测试
HashSet.contains() 的完整官方 java-api 文档:
public boolean contains(Object o)如果此集合包含 指定的元素。更正式地说, 返回
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)
有什么想法或建议吗?
【问题讨论】:
标签: java equals hashcode contains hashset