java~重写hashcode和equals

news/2024/11/13 20:35:22/文章来源:https://www.cnblogs.com/lori/p/18392567

单字段和多字段重写hashcode

在 Java 中,重写 hashCode 方法的场景通常与对象的哈希值计算有关,特别是在使用哈希表(如 HashMap, HashSet 等)时。下面是你提供的两种 hashCode 实现的具体使用场景分析:

1. 第一种实现

@Override
public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;DefaultClientScopeRealmMappingEntity.Key key = (DefaultClientScopeRealmMappingEntity.Key) o;if (clientScopeId != null ? !clientScopeId.equals(key.getClientScopeId() != null ? key.getClientScopeId() : null) : key.getClientScopeId() != null) return false;if (realm != null ? !realm.getId().equals(key.realm != null ? key.realm.getId() : null) : key.realm != null) return false;return true;
}
@Override
public int hashCode() {int result = clientScopeId != null ? clientScopeId.hashCode() : 0;result = 31 * result + (realm != null ? realm.getId().hashCode() : 0);return result;
}

使用场景:

  • 多字段组合:当一个对象由多个字段组成且这些字段共同决定对象的唯一性时,这种方式非常合适。在这个例子中,clientScopeIdrealm.getId() 两个字段共同影响对象的哈希值。
  • 确保一致性:如果 clientScopeIdrealm 是对象的重要属性,并且它们的值会影响对象的相等性(即 equals 方法),则需要根据这些字段来计算哈希值,以确保在集合中正确地存储和查找对象。
  • 避免哈希冲突:通过将多个字段结合起来计算哈希值,可以降低不同对象之间的哈希冲突概率,提高性能。

2. 第二种实现

@Override
public boolean equals(Object o) {if (this == o) return true;if (o == null) return false;if (!(o instanceof CredentialEntity)) return false;CredentialEntity that = (CredentialEntity) o;if (!id.equals(that.getId())) return false;return true;
}
@Override
public int hashCode() {return id.hashCode();
}

使用场景:

  • 单一标识符:当对象可以用单一字段(如 id)唯一标识时,这种实现方式更加简洁有效。如果 id 是对象的唯一标识符,那么直接使用 id 的哈希值是合理的。
  • 简单性:这种实现较为简单,易于理解,适用于那些不需要考虑多个字段组合的情况。
  • 性能优化:由于只计算一个字段的哈希值,性能开销较小,适合对性能要求较高的场景。

总结

  • 选择第一种实现:适用于包含多个重要字段的复杂对象,确保对象在集合中的正确性和唯一性。
  • 选择第二种实现:适用于简单对象,仅依赖于一个唯一标识符,代码更简洁且性能较好。

在实际开发中,选择哪种实现应依据对象的设计及其在数据结构中的使用方式。确保 hashCodeequals 方法的一致性是非常重要的,以避免潜在的错误。

hashCode 方法和 equals 方法的不一致时的问题

在 Java 中,hashCode 方法和 equals 方法的不一致性会导致一系列问题,特别是在使用哈希表(如 HashMap, HashSet 等)时。以下是一些主要的问题:

1. 数据丢失

  • 无法查找:如果两个对象被认为相等(即 equals 返回 true),但它们的哈希码不同(即 hashCode 返回不同的值),则它们可能会被存储在哈希表中的不同桶中。这意味着你无法通过一个对象找到另一个对象,从而导致数据丢失。

2. 错误的集合行为

  • 重复元素:在 HashSet 中,如果两个对象的 equals 方法返回 true,则不应允许将其作为重复元素添加。如果 hashCode 不一致,可能会导致集合中出现多个看似相同的元素。
  • 错误的删除操作:当从集合中删除一个对象时,如果 hashCode 不一致,可能会导致无法正确找到并删除该对象。

3. 性能问题

  • 性能下降:不一致的 hashCodeequals 实现会导致哈希表中的链表变长,从而影响查找和插入操作的性能。这使得哈希表的平均时间复杂度从 O(1) 降低到 O(n)。

4. 难以调试

  • 逻辑错误:由于不一致性,程序的行为可能与预期不符,这使得调试变得更加困难。开发者可能难以追踪问题的根源,因为错误可能在于对象的比较和哈希计算。

5. 违反合同

  • 违反 Java 合同:Java 文档明确规定,如果两个对象相等(a.equals(b)true),那么它们的哈希码必须相等(a.hashCode() == b.hashCode())。不遵循这一规则会导致程序行为不可预测,甚至引发异常。

结论

为了避免上述问题,确保在重写 equals 方法时也相应地重写 hashCode 方法,并且要保证它们之间的一致性。通常的做法是:

  • 如果两个对象相等(equals 返回 true),那么它们的 hashCode 必须相等。
  • 如果两个对象的 hashCode 相等,则它们不一定相等,但如果相等,则应返回 true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/791008.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鱼眼相机成像模型和畸变模型

一文详解分析鱼眼相机投影成像模型和畸变模型 - feng..liu - 博客园 (cnblogs.com) 深入洞察OpenCV鱼眼模型之成像投影和畸变表估计系数相互转化 - 知乎 (zhihu.com)

第十二周-云计算运维作业

总结zabbix安装过程(选择课程演示版本)。1. 下载仓库 # wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4+ubuntu22.04_all.deb # dpkg -i zabbix-release_6.0-4+ubuntu22.04_all.deb # apt update 2. 安装Zabbix server,W…

OpenCV开发笔记(八十):基于特征点匹配实现全景图片拼接

前言一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野。拼接的方法分为两条路,第一条路是Sticher类,第二条思路是特征点匹配。  本篇使用特征点匹配,进行两张图来视野合并拼接。 Demo100%的点匹配  换了一幅图…

中国最著名十大风水大师排名

风水大师,又称阴阳先生,因为它们常常在看风水时利用阴阳学说进行解释,于是便有了这样的称谓。风水大师从古至今非常之多,其中也不乏江湖骗子。本期风水大师就来说说中国知名的有真材实料的风水大师吧。 中国最著名十大风水大师排名 Top1裴翁 裴翁(又名裴伟胜),是世界地理名…

从实在智能最新发布的实在Agent 7.0,看RPA Agent的迭代升级

智能体进化发展了一年,现在的RPA Agent迭代到什么程度了? 从实在智能最新发布的实在Agent 7.0,看RPA Agent的迭代升级 抓取豆瓣信息、自己制作PPT,这款AI Agent真的实现了流程全自动化 AI Agent构建到执行全自动化,持续进化RPA Agent再次降低智能体应用门槛 实在智能重磅发…

丝滑解决Chatgpt频繁奔溃、断网掉线问题

这段时间使用Chatgpt的时候频繁出现`something wrong`等断网掉线问题,中间还频繁出现物品转向的人机验证(我那么具有迷惑性吗...),被烦的不行。后面了解到有一个**KeepChatgpt**的插件可以解决这些问题,于是把这个方法介绍给大家,希望大家也都可以丝滑gpt。事件缘由 这段…

周赛413场 个人总结

周赛413场 个人总结第1题 代码 """ 根据a的ascii码值是97 奇数 黑色的规律是: a1是 97 + 1 = 偶数 b2 是 98 + 2 =偶数 c1 是99 +1 = 偶数 d2 是100 + 2 = 偶数 ... 所以,偶数为黑色 === 白色的规律 a2 = 97 +2 = 奇数 b1 = 98 +1 = 奇数 .... 所以,奇数为…

【LaTex、markdown】常用语法写出漂亮的blog

@目录markdown加粗斜体设置标题级别设置目录删除线无序列表有序列表分割线代办引用高亮标记字体颜色代码块图片链接表格公式表达行中公式独行公式LaTex初步文章骨干换行与换页figure(基本是图片)表格公式公式字体颜色左右居中figure引用文献引用markdown 加粗 **加粗样式**格…

YOLOS:大道至简,直接使用预训练ViT进行实时目标检测 | NeurIPS 2021

论文探索了在中型ImageNet-1k数据集上预训练的普通ViT到更具挑战性的COCO目标检测基准的可迁移性,提出了基于Vision Transformer的You Only Look at One Sequence(YOLOS)目标检测模型。在具有挑战性的COCO目标检测基准上的实验结果表明,2D目标检测可以以纯sequence-to-sequen…

MetaLlama大模型

llama 大模型介绍我们介绍 LLaMA,这是一个基础语言模型的集合,参数范围从 7B 到 65B。我们在数万亿个Token上训练我们的模型,并表明可以专门使用公开可用的数据集来训练最先进的模型,而无需诉诸专有的和无法访问的数据集。特别是,LLaMA-13B 在大多数基准测试中都优于 GPT-…

GraphRAG 检索增强+图模型

https://arxiv.org/pdf/2404.16130往期的NaiveRAG基本都是显式检索,而GraphRAG通过知识图谱实现了总结能力。知识图谱通常是事先生成的,并存储在系统中,供用户查询和模型使用。 1 引入 通常意义上,RAG的作用是从外部知识源中检索相关信息,使LLM能够回答有关私有或以前未见…

LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024

Less-Attention Vision Transformer利用了在多头自注意力(MHSA)块中计算的依赖关系,通过重复使用先前MSA块的注意力来绕过注意力计算,还额外增加了一个简单的保持对角性的损失函数,旨在促进注意力矩阵在表示标记之间关系方面的预期行为。该架构你能有效地捕捉了跨标记的关…