gpt4 book ai didi

java hashCode疑惑

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:55:26 28 4
gpt4 key购买 nike

我有这个程序:

import java.util.*;
public class test {
private String s;
public test(String s) { this.s = s; }
public static void main(String[] args) {
HashSet<Object> hs = new HashSet<Object>();
test ws1 = new test("foo");
test ws2 = new test("foo");
String s1 = new String("foo");
String s2 = new String("foo");
hs.add(ws1);
hs.add(ws2);
hs.add(s1);
hs.add(s2); // removing this line also gives same output.
System.out.println(hs.size());
}
}

请注意,这不是作业。我们今天早些时候在测验中被问到这个问题。我知道答案,但试图理解为什么会这样。

上面的程序给出了 3 作为输出。

谁能解释一下这是为什么?

我认为(不确定):

java.lang.String 类覆盖了 java.lang.Object 中的 hashCode 方法。因此,值为“foo”的 String 对象将被视为重复项。测试类没有覆盖 hashCode 方法并最终使用 java.lang.Object 版本并且这个版本总是为每个对象返回不同的哈希码,所以这两个测试添加的对象被视为不同。

最佳答案

在这种情况下,它与hashCode() 无关,而是与equals() 方法有关。 HashSet 仍然是 Set,具有不允许重复的语义。使用 equals() 方法检查重复项,如果是 String 将返回 true

然而,对于您的test 类,equals() 方法没有定义,它将使用Object 的默认实现,它只会返回true当两个引用都指向同一个实例时。

方法 hashCode() 不是用来检查对象是否应该被视为相同的,而是作为一种基于散列函数将它们分布在集合中的方法。对于两个对象,此方法绝对有可能返回相同的值,而 equals() 将返回 false。

附言ObjecthashCode 实现不保证值的唯一性。使用简单的循环很容易检查。

关于java hashCode疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5630609/

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