gpt4 book ai didi

Java Hashset.contains() 产生神秘的结果

转载 作者:太空狗 更新时间:2023-10-29 22:50:08 25 4
gpt4 key购买 nike

我通常不使用 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)

Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).

http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html#contains(java.lang.Object)

有什么想法或建议吗?

最佳答案

您的equals 方法需要接受一个Object
因为您将它声明为采用 L,所以它变成了一个额外的重载,而不是覆盖该方法。
因此,当 hashSet 类调用 equals 时,它解析为基础 Object.equals 方法。当您调用 equals 时,您调用了重载,因为 ab 都被声明L 而不是 Object

为防止将来出现此问题,您应该在重写方法时添加@Override
这样,如果它实际上不是覆盖,编译器会警告您。

关于Java Hashset.contains() 产生神秘的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4115978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com