100%会用到的hashCode()和equals()方法及使用规范

嗨,大家好,欢迎来到程序猿漠然公众号,我是漠然。

在Java编程中,equals()hashCode()这两个方法如同对象的"双胞胎",总是成对出现。它们决定了对象在集合中的"身份"和"地位"。今天,我们就来深入解析这两个方法的奥秘,以及如何正确地使用它们。

equals()方法

equals()方法是用来判断两个对象是否"相等"的。在Java中,"相等"意味着两个对象的内容完全一致,而不仅仅是它们的内存地址相同。 使用规范

  • • 自反性:x.equals(x)必须返回true
  • • 对称性:如果x.equals(y)返回true,则y.equals(x)也必须返回true
  • • 传递性:如果x.equals(y)y.equals(z)都返回true,则x.equals(z)也必须返回true
  • • 一致性:多次调用x.equals(y)应该总是返回相同的值。
  • • 非空性:任何非null的引用值xx.equals(null)必须返回false

hashCode()方法

hashCode()方法是用来生成对象的哈希码的,这是一个整数。在Java中,很多数据结构如HashSet、HashMap等都依赖哈希码来快速查找对象。 使用规范

  • • 如果两个对象通过equals()方法返回true,它们必须具有相同的哈希码。
  • • 如果两个对象通过equals()方法返回false,它们可以具有相同的哈希码。
  • • 任何时候,只要对象的内容发生了改变,它的哈希码也应该改变。

示例分析

让我们以String类为例,来分析其equals()hashCode()方法的实现:

ini 复制代码
@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null || getClass() != obj.getClass()) {
        return false;
    }
    String other = (String) obj;
    int n = value.length;
    if (n == other.value.length) {
        for (int i = 0; i < n; i++) {
            if (value[i] != other.value[i]) {
                return false;
            }
        }
        return true;
    }
    return false;
}
@Override
public int hashCode() {
    int hash = 0;
    for (int i = 0; i < value.length; i++) {
        hash = 31 * hash + value[i];
    }
    return hash;
}

在上述代码中,String类的equals()方法首先判断两个对象是否为同一个实例,然后比较长度和每个字符。而hashCode()方法则是根据字符串的每个字符计算哈希码。

举例子

假设我们有一个Person类,它有两个属性:nameage。我们要判断两个Person对象是否是同一个人,不仅要看他们的nameage是否一样,还要看他们的"身份证号"是否一样。所以,我们重写了equals()hashCode()方法,让它们根据Personnameage来判断相等性和给出"身份证号"。

ini 复制代码
public class Person {
    private String name;
    private int age;
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person other = (Person) obj;
        return age == other.age && name.equals(other.name);
    }
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 31 * hash + name.hashCode();
        hash = 31 * hash + age;
        return hash;
    }
}

在这个例子中,我们首先判断两个Person对象是否为同一个实例,然后比较它们的nameage。如果它们都相同,那么这两个Person对象就是相等的。同时,我们根据nameage计算哈希码,以便在集合中快速找到对应的Person对象。

总结

在Java编程中,正确使用equals()hashCode()方法至关重要。我们需要根据业务逻辑重写这两个方法,并遵循上述规范。只有这样,我们才能保证对象的身份证系统正常运行,避免出现数据结构混乱和异常。记住,当你在Java的海洋中航行时,equals()hashCode()就是你的指南针,没有它们,你可能会在茫茫代码中迷失方向。

今天的分享就到这里,如果觉得对你有帮助,感谢点赞、分享、关注一波,你的认可是我创造的最大动力。

更多内容请关注公众号:程序猿漠然,一个分享有趣后端知识的公众号。

相关推荐
赴前尘6 小时前
golang 查看指定版本库所依赖库的版本
开发语言·后端·golang
CCPC不拿奖不改名6 小时前
SQL基础(SQL小白教程):MySQL语句+环境一键搭建+面试习题
数据库·sql·计算机网络·mysql·oracle·面试·职场和发展
Dream it possible!8 小时前
LeetCode 面试经典 150_二分查找_在排序数组中查找元素的第一个和最后一个位置(115_34_C++_中等)
c++·leetcode·面试
Marktowin12 小时前
Mybatis-Plus更新操作时的一个坑
java·后端
清 澜12 小时前
大模型扫盲式面试知识复习 (二)
人工智能·面试·职场和发展·大模型
赵文宇12 小时前
CNCF Dragonfly 毕业啦!基于P2P的镜像和文件分发系统快速入门,在线体验
后端
程序员爱钓鱼13 小时前
Node.js 编程实战:即时聊天应用 —— WebSocket 实现实时通信
前端·后端·node.js
掘金安东尼13 小时前
⏰前端周刊第 448 期(2026年1月4日-1月10日)
前端·面试·github
邹阿涛涛涛涛涛涛13 小时前
月之暗面招聘 Android
面试·招聘