Joc*_*hen 15 java contains equals hashcode hashset
我通常不用Java编写代码,但最近我开始没有选择.我可能对如何正确使用HashSet有一些重大误解.所以我可能做的事情可能是完全错误的.但是我很感激您提供的任何帮助.那么实际问题:
在我写的一个小程序中,我生成了非常相似的对象,这些对象在创建时会有一个非常具体的id(a 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());
}
}
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
true
false
true
true
Run Code Online (Sandbox Code Playgroud)
显然,contains不使用equals提供的功能L,或者我对这个概念有一些重大的误解......
我用openjdk(ubuntu中包含的当前版本)和Win7上Oracle的官方当前java测试了它
为完整性官方java-api文档HashSet.contains():
public boolean contains(Object o)
true如果此set包含指定的元素,则返回.更正式地说,返回true当且仅当此set包含的元素e,使得(o==null ? e==null : o.equals(e)).
http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html#contains(java.lang.Object)
任何想法或建议?
SLa*_*aks 28
你的equals方法需要采取Object.
因为你声明它是一个L,它变成一个额外的重载而不是覆盖该方法.
因此,当hashSet类调用时equals,它将解析为基本Object.equals方法.当你打电话equals,你打电话给你,因为过载a和b均宣布作为L代替Object.
为了防止将来出现此问题,您应该@Override在重写方法时添加.
这样,如果编译器实际上不是覆盖,编译器将发出警告.
| 归档时间: |
|
| 查看次数: |
19659 次 |
| 最近记录: |