当前位置: 首页 > 知识库问答 >
问题:

Java LinkedHashSet包含方法的问题

艾骏喆
2023-03-14

我在LinkedHashSet及其contains方法中遇到了这个问题。我来给大家总结一下。

这个类C1包含4个String属性、相应的getter和setter以及equals()和hashCode()方法,这是Eclipse默认给出的。

C1 c1 = new C1("a", "b", "c", "d");
C2 c2 = new C2();
c2.getSet().add(c1);

有人明白这里发生了什么吗?会出什么问题?Equals和HashCode()?

提前感谢,干杯

共有1个答案

后焕
2023-03-14

当您将对象添加到哈希集(或哈希映射或任何使用哈希查找对象的集合)时,collection类将根据为该对象计算的哈希代码将该对象放入“bucket”中。在此之后,您将更改对象的一个属性,因此下次计算对象时该对象的hashcode将不同。但是,对象位于旧的hashcode对应的位置/桶中。因此,当您试图查找具有更改的属性和hashcode的对象时,该集合在错误的bucket中查找,并发现它是空的。哈希代码或equals方法都没有问题。您在这里犯的错误是:一旦对象被放入哈希集或哈希映射中,就永远不要更改用于哈希映射计算的对象的字段。作为最佳实践,如果您知道要将C1的这些属性放入哈希集中,则将其作为final属性。

 类似资料:
  • 问题内容: 有没有类似于Go中的方法的东西,而不必搜索切片中的每个元素? 问题答案: Mostafa已经指出,编写这种方法很简单,而mkb为您提供了使用sort包中的二进制搜索的提示。但是,如果要进行很多此类包含检查,则还可以考虑使用地图。 使用惯用语检查特定的映射键是否存在很简单。由于您对值不感兴趣,因此也可以创建一个例如。在此处使用空值的优点是不需要任何额外的空间,并且Go的内部映射类型针对该

  • 是否有类似于方法,而不必搜索片中的每个元素?

  • 问题内容: 我一直在学习PHP的语法并进行实践。我来自.NET背景,因此对于页眉和页脚,母版页始终使我很轻松。 到目前为止,我有一个mainHeader.php和mainFooter.php,其中包含我的头菜单和我的页脚html。我创建了一个mainBody.php,在顶部放了 对于页脚,我把 这样做非常好,让我微笑,因为我的页面都很好地融合在一起。mainHeader有我的,而mainFoote

  • 问题内容: 谁可以给我解释一下这个?我下面有两个查询及其结果。 查询 : 结果集 : 赫兹租车 海明威小酒馆 查询 : 结果集 : 没有 第一个查询是我期望的,但是我希望第二个查询返回“ Hertz Car Rental”。我是否从根本上误解了“ *”在全文搜索中的工作方式? 谢谢! 问题答案: 我认为SQL Server会将您的字符串解释为prefix_terms。星号不是普通的旧通配符。全文和

  • 我有一个文本字段(名称),我想防止用户输入数字,或为空! 我尝试了所有这些,但其中有一些缺陷:

  • 我正在尝试从azure服务总线主题中读取消息,并使用C#的控制台应用程序显示它。我发现了很多他们正在使用的在线解决方案 当我试图在我的程序中使用相同的东西时,会得到红色的弯曲线,说明subscriptionclient不包含CreateFromConnection字符串的定义。我使用的是Microsoft.Azure.ServiceBus包。我在Microsoft.ServiceBus.Messa