java~重写hashcode和equals

打印 上一主题 下一主题

主题 532|帖子 532|积分 1596

单字段和多字段重写hashcode

在 Java 中,重写 hashCode 方法的场景通常与对象的哈希值计算有关,特别是在使用哈希表(如 HashMap, HashSet 等)时。下面是你提供的两种 hashCode 实现的具体使用场景分析:
1. 第一种实现
  1. @Override
  2. public boolean equals(Object o) {
  3.     if (this == o) return true;
  4.     if (o == null || getClass() != o.getClass()) return false;
  5.     DefaultClientScopeRealmMappingEntity.Key key = (DefaultClientScopeRealmMappingEntity.Key) o;
  6.     if (clientScopeId != null ? !clientScopeId.equals(key.getClientScopeId() != null ? key.getClientScopeId() : null) : key.getClientScopeId() != null) return false;
  7.     if (realm != null ? !realm.getId().equals(key.realm != null ? key.realm.getId() : null) : key.realm != null) return false;
  8.     return true;
  9. }
  10. @Override
  11. public int hashCode() {
  12.     int result = clientScopeId != null ? clientScopeId.hashCode() : 0;
  13.     result = 31 * result + (realm != null ? realm.getId().hashCode() : 0);
  14.     return result;
  15. }
复制代码
使用场景:


  • 多字段组合:当一个对象由多个字段组成且这些字段共同决定对象的唯一性时,这种方式非常符合。在这个例子中,clientScopeId 和 realm.getId() 两个字段共同影响对象的哈希值。
  • 确保一致性:假如 clientScopeId 和 realm 是对象的重要属性,并且它们的值会影响对象的相称性(即 equals 方法),则必要根据这些字段来计算哈希值,以确保在集合中正确地存储和查找对象。
  • 制止哈希辩论:通过将多个字段结合起来计算哈希值,可以降低差别对象之间的哈希辩论概率,提高性能。
2. 第二种实现
  1. @Override
  2. public boolean equals(Object o) {
  3.     if (this == o) return true;
  4.     if (o == null) return false;
  5.     if (!(o instanceof CredentialEntity)) return false;
  6.     CredentialEntity that = (CredentialEntity) o;
  7.     if (!id.equals(that.getId())) return false;
  8.     return true;
  9. }
  10. @Override
  11. public int hashCode() {
  12.     return id.hashCode();
  13. }
复制代码
使用场景:


  • 单一标识符:当对象可以用单一字段(如 id)唯一标识时,这种实现方式更加轻便有效。假如 id 是对象的唯一标识符,那么直接使用 id 的哈希值是公道的。
  • 简朴性:这种实现较为简朴,易于明白,适用于那些不必要思量多个字段组合的环境。
  • 性能优化:由于只计算一个字段的哈希值,性能开销较小,适合对性能要求较高的场景。
总结


  • 选择第一种实现:适用于包含多个重要字段的复杂对象,确保对象在集合中的正确性和唯一性。
  • 选择第二种实现:适用于简朴对象,仅依靠于一个唯一标识符,代码更轻便且性能较好。
在现实开发中,选择哪种实现应依据对象的设计及其在数据布局中的使用方式。确保 hashCode 和 equals 方法的一致性是非常重要的,以制止埋伏的错误。
hashCode 方法和 equals 方法的不一致时的题目

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


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


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


  • 性能降落:不一致的 hashCode 和 equals 实现会导致哈希表中的链表变长,从而影响查找和插入操作的性能。这使得哈希表的均匀时间复杂度从 O(1) 降低到 O(n)。
4. 难以调试


  • 逻辑错误:由于不一致性,步伐的行为可能与预期不符,这使得调试变得更加困难。开发者可能难以追踪题目的根源,因为错误可能在于对象的比力和哈希计算。
5. 违背条约


  • 违背 Java 条约:Java 文档明确规定,假如两个对象相称(a.equals(b) 为 true),那么它们的哈希码必须相称(a.hashCode() == b.hashCode())。不遵循这一规则会导致步伐行为不可预测,甚至引发非常。
结论

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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表