当前位置: 首页 > news >正文

面试tips--java--equals() hashCode()

1. equals() 方法

  • 作用:用于比较两个对象的 内容是否相等

  • 默认实现:在 Object 类中,equals() 默认使用 ==,比较的是对象的 内存地址(即是否为同一个对象)。

  • 常见重写场景:当我们希望比较对象的“内容”而不是“地址”时,就需要重写 equals() 方法。

    • 比如 String 类就重写了 equals(),所以 new String("abc").equals(new String("abc")) 会返回 true,即使它们不是同一个对象。

例子:

public class Person {private String name;private int age;@Overridepublic boolean equals(Object o) {if (this == o) return true; // 内存地址相同,直接trueif (o == null || getClass() != o.getClass()) return false; // 类型不同直接falsePerson person = (Person) o;return age == person.age && name.equals(person.name); // 内容比较}
}

2. hashCode() 方法

  • 作用:返回对象的 哈希值int 类型),主要用于 哈希结构的集合(如 HashMapHashSetHashtable 等)。

  • 哈希表存储原理

    1. 插入对象时,先计算对象的 hashCode()

    2. hashCode() 定位到某个“桶”(bucket)。

    3. 如果桶中有多个对象,再用 equals() 判断对象是否相同。

  • 默认实现:在 Object 类中,hashCode() 会根据对象的内存地址计算,因此不同对象一般哈希值不同。

例子:

public class Person {private String name;private int age;@Overridepublic int hashCode() {return name.hashCode() + age;}
}

3. 为什么重写 equals() 必须重写 hashCode()

3.1 Java 规定

Java 规定了 equals()hashCode()契约

  1. 如果两个对象 equals() 返回 true,那么它们的 hashCode() 必须相等。

  2. 如果两个对象 equals() 返回 false,它们的 hashCode() 可以相等(但最好减少冲突)。

3.2 原因

如果只重写了 equals(),没重写 hashCode(),可能导致集合中找不到对象。

示例:

Person p1 = new Person("Tom", 18);
Person p2 = new Person("Tom", 18);HashSet<Person> set = new HashSet<>();
set.add(p1);System.out.println(set.contains(p2));
  • 如果 只重写了 equals()

    • p1.equals(p2)true(内容相等)。

    • p1.hashCode()p2.hashCode() 不同(因为默认按内存地址算)。

    • HashSet 会认为它们在不同的桶中 → contains(p2) 返回 false ❌。

  • 如果 同时重写了 equals()hashCode()

    • 哈希值相同,定位到同一个桶。

    • 再用 equals() 比较内容 → 找到对象 → contains(p2) 返回 true ✅。


4. 正确的重写方式

推荐使用 IDE 自动生成,例如 IntelliJ IDEA/ Eclipse 可以自动生成基于字段的 equals()hashCode()

示例(推荐写法)

import java.util.Objects;public class Person {private String name;private int age;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

5. 总结

  1. equals():比较对象的内容是否相等。

  2. hashCode():返回对象的哈希值,用于哈希集合快速查找。

  3. 必须遵守契约

    • equals() 相等 → hashCode() 必须相等。

    • 否则哈希集合(HashMap/HashSet)会出现“存了却找不到”的问题。

  4. 正确姿势:重写 equals() 时,一定要重写 hashCode()

http://www.dtcms.com/a/357324.html

相关文章:

  • 莱特莱德:以“第四代极限分离技术”,赋能生物发酵产业升级
  • 自动驾驶中的传感器技术36——Lidar(11)
  • 可解释人工智能XAI
  • 手写MyBatis第40弹:手写MyBatis框架阶段性总结,你的ORM框架已达生产级雏形
  • 【nvidia-B200】生产报错common.h:14:10: fatal error: mpi.h: No such file or directory
  • (论文速读)RADIOv2.5:聚合式视觉基础模型
  • 美摄科技受邀参加2025中关村论坛年会,以超高清车载影像技术赋能智慧出行新体验!
  • 【报错】RuntimeError: HIP error: invalid device function
  • Python计算点云的均值、方差、标准差、凸点(顶点)、质心和去中心化
  • week5-[二维数组]对角线
  • idea2025.1.5安装+pj
  • 计算机视觉第一课opencv(四)保姆级教学
  • 构建稳定和可扩展云基础设施的首选服务:AWS的EC2实例
  • 【三维渲染技术讨论】Blender输出的三维文件里的透明贴图在Isaac Sim里会丢失, 是什么原因?
  • 2024年09月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • JVM_JMM
  • Java ThreadLocal为什么要用弱引用
  • Vue2 和 Vue3 里的防抖:简单说清楚怎么用
  • 【C语言入门级教学】sizeof和strlen的对⽐
  • 数据存储——数据库
  • 并发编程——07 深入理解AQS之独占锁ReentrantLock源码分析
  • 编程设计模式
  • 【系列02】端侧AI:构建与部署高效的本地化AI模型 第1章:为什么是端侧AI?
  • 【LINUX】常用基本指令(1)
  • go 使用rabbitMQ
  • 神经网络|(十六)概率论基础知识-伽马函数·中
  • Hugging Face入门指南:AI创客的数字游乐场
  • 解析json
  • LeetCode 142.环形链表 II
  • 【前端教程】JavaScript 数组对象遍历与数据展示实战