gpt4 book ai didi

java - 了解Java HashSet的contains方法

转载 作者:太空狗 更新时间:2023-10-29 23:04:26 25 4
gpt4 key购买 nike

新手关于java HashSet的问题

Set<User> s = new HashSet<User>();
User u = new User();
u.setName("name1");
s.add(u);
u.setName("name3");
System.out.println(s.contains(u));

有人可以解释为什么这段代码输出 false 吗?此外,此代码甚至不调用用户的 equals 方法。但是根据 HashSet 和 HashMap 的来源,它必须调用它。 User 的 equals 方法只是在用户名上调用 equals。方法hashCode 返回用户名的hashCode

最佳答案

如果散列码方法是基于name字段,然后在添加对象后更改它,那么第二次contains检查将使用新的散列值, 并且找不到您要查找的对象。这是因为 HashSet 首先通过哈希码进行搜索,因此如果搜索失败,它们将不会费心调用 equals

唯一可行的方法是,如果您没有覆盖equals(因此使用了默认引用相等性)并且您很幸运,两个对象的哈希码相等。但这种情况真的不太可能发生,您不应该依赖它。

一般来说,如果将对象添加到 HashSet 后,您应该永远不要更新对象,如果该更改也会更改其哈希码。

关于java - 了解Java HashSet的contains方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7026564/

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