对equals()和hashCode()的理解?

devtools/2024/9/24 9:18:43/

equals()hashCode() 是 Java 中用于对象比较和存储的两个重要方法。在使用集合(如 HashMap, HashSet, Hashtable 等)时,这两个方法尤其重要。让我们逐一了解这两个方法的概念和它们之间的关系。

1. equals() 方法

  • 定义equals() 方法用于比较两个对象是否相等。默认情况下,Object 类的 equals() 方法比较的是对象的内存地址,因此两个不同的对象即使内容相同, 也不会被认为是相等的。通常需要根据对象的属性来重写这个方法来进行内容比较。

  • 重写:在重写 equals() 方法时,通常遵循以下约定:

    • 自反性:对于任何非 null 的引用值 xx.equals(x) 应返回 true
    • 对称性:对于任何非 null 的引用值 xy,当且仅当 x.equals(y) 返回 true 时,y.equals(x) 也应返回 true
    • 传递性:对于任何非 null 的引用值 xyz,如果 x.equals(y) 返回 truey.equals(z) 返回 true,那么 x.equals(z) 也应返回 true
    • 一致性:如果 x.equals(y) 返回 true,则多次调用 x.equals(y) 应返回相同的结果。
    • 对于 null 值的比较:对于任何非 null 的引用值 xx.equals(null) 应返回 false

示例:

java">class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object obj) {if (this == obj) return true; // 如果引用相同if (obj == null || getClass() != obj.getClass()) return false; // 匹配类型Person that = (Person) obj;return age == that.age && name.equals(that.name); // 比较属性}@Overridepublic int hashCode() {return 31 * name.hashCode() + age; // 根据属性生成hash值}
}

2. hashCode() 方法

  • 定义hashCode() 方法返回对象的哈希码(整数)。哈希码是对象在哈希表中存储的位置的一种方式。对于相同的对象,hashCode() 方法必须返回相同的整数值。

  • 重写:当重写 hashCode() 方法时,要遵循以下约定:

    • 如果两个对象通过 equals() 方法相等,则它们的 hashCode() 方法必须返回相同的整数。
    • 如果两个对象不相等,它们的 hashCode() 方法可以返回相同的整数,但返回不同的整数会提高性能。

示例:

在上面的 Person 类中,我们重写 hashCode() 方法,确保它与 equals() 方法一致。

3. 重要关系

  • 一致性:如果 x.equals(y) 返回 true,那么 x.hashCode()y.hashCode() 也必须返回相同的值。反之则不一定。

  • 哈希表:在使用 HashMapHashSet 等集合时,首先会调用 hashCode() 方法来确定对象在数组中的位置,然后在该位置通过 equals() 方法来比较相同位置上的对象。

示例代码:

以下是一个集合使用 equals()hashCode() 的示例:

java">import java.util.HashSet;public class Main {public static void main(String[] args) {HashSet<Person> set = new HashSet<>();set.add(new Person("Alice", 30));set.add(new Person("Bob", 25));// 具有相同属性的对象Person anotherAlice = new Person("Alice", 30);// 因为重写了equals()和hashCode(),这个对象会被认为是相等的System.out.println(set.contains(anotherAlice)); // 输出 true}
}

总结

  • equals() 用于比较对象的内容相等性,而 hashCode() 用于生成对象的哈希码,帮助存储和检索。
  • 在使用集合时,适当地重写这两个方法是非常重要的,以确保正常的操作。

希望这个解释清楚了 equals()hashCode() 的概念及其重要性!如果还有其他问题,请随时问我!


http://www.ppmy.cn/devtools/99723.html

相关文章

贪心算法-分数背包问题

贪心算法与分数背包问题详解 目录 贪心算法与分数背包问题详解贪心算法简介分数背包问题问题分析算法步骤流程图代码实现&#xff08;C&#xff09;总结 C学习资源 贪心算法简介 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择&#xff0c;从而希望导致结果…

web 3D可视化技术

一.介绍 web 3D可视化技术的发展与应用展开&#xff0c;学习web 3D技术&#xff0c;包括利用js库进行项目搭建&#xff0c;学习图形学知识&#xff0c;掌握web 3D基础概念如点、线、面等&#xff0c;以及深入探讨渲染技术如PBR&#xff0c;材质贴图和环境光等。内容还涉及了与…

Compose(7)交互和动画

在 Jetpack Compose 中&#xff0c;交互和动画是提升用户体验的重要手段。 一、交互 1.点击事件 使用 Button 组件时&#xff0c;可以通过 onClick 参数来处理点击事件。 例如&#xff1a; Composablefun ClickableButton() {Button(onClick {// 处理点击事件的逻辑}) {Te…

国际校企合作|深信服、常州信息职业技术学院、马来西亚汽车工业大学三方国际化人才培养合作签约仪式圆满成功

2024年8月19日&#xff0c;深信服科技股份有限公司与常州信息职业技术学院、马来西亚汽车工业大学正式签署了具有里程碑意义的国际校企合作协议。此次签约不仅是“教随产出、校企同行”理念的一次成功实践&#xff0c;更是中马两国友谊与合作的象征。 常州信息职业技术学院党委…

正则表达式匹配成对括号

匹配一对括号&#xff0c;用于在一个html文本中提取JSon 文本。例如 { “duration”:7599,"minBufferTime{second bracket }{third bracket} } 一对加粗的{} &#xff0c;而不要中间的{}。简单写法会出现错误匹配。 在.Net Framework的正则表达式中&#xff0c;提供了”…

数学建模学习(117):四阶龙格-库塔方法从理论到Python/matlab实践

文章目录 1. 概述2. 输入要求3. 公式介绍4. 实例与应用案例 1: 使用h = 0.5解决问题案例2: 使用不同步长 h = 0.2和h = 0.05 的比较案例 3: 自适应步长控制与Runge-Kutta-Fehlberg方法5. 代码实现5.1 Python实现四阶龙格-库塔方法5.2 Matlab实现四阶龙格-库塔方法5.3 Matlab实现…

研究人员利用ChatGPT的强大功能,创建数字病理学AI工具

丹娜—法伯癌症研究所和威尔康奈尔医学院的科学家开发并测试了针对数字病理学的新型人工智能工具。数字病理学是一个相对较新的领域&#xff0c;它使用由组织样本创建的高分辨率数字图像来诊断疾病并为治疗决策提供参考。 他们的论文于 2024 年 7 月 9 日发表在《柳叶刀数字健…

ML307R_APP_DEMO_SDK TCP/UDP使用介绍

ML307R_APP_DEMO_SDK是在ML307R_OpenCPU_Standard_SDK标准代码基础上&#xff0c;新增了面向用户APP层的demo示例&#xff0c;与标准代码中examples的示例代码不同&#xff0c;app_demo实现了联网自动化&#xff0c;数据透传&#xff0c;各功能可独立自动运行&#xff0c;并对用…