两个对象的 hashCode()相同,则 equals()

简介: 当两个对象的 `hashCode()` 方法返回值相同时,这两个对象的 `equals()` 方法不一定返回 `true`。`hashCode()` 相同仅表示两对象可能相等,需进一步通过 `equals()` 方法验证对象是否真正相等。
  1. 首先明确hashCode()和equals()方法的关系:
    • 在Java中,hashCode()方法是用来获取对象的哈希码,这个哈希码主要用于哈希表(如HashMap、HashSet等数据结构)中确定对象的存储位置。equals()方法用于比较两个对象是否在逻辑上“相等”。
    • 根据Java的规范,如果两个对象通过equals()方法比较返回true,那么它们的hashCode()方法必须返回相同的值。但是,反过来并不一定成立。
  2. 当两个对象的hashCode()相同,它们的equals()方法不一定返回true。
    • 例如,假设有一个简单的Person类,它有两个属性name和age,重写hashCode()方法时只考虑age属性来生成哈希码,重写equals()方法时考虑name和age两个属性。
      class Person {
             
        private String name;
        private int age;
        public Person(String name, int age) {
             
            this.name = name;
            this.age = age;
        }
        @Override
        public int hashCode() {
             
            return Integer.hashCode(age);
        }
        @Override
        public boolean equals(Object obj) {
             
            if (obj == this) {
             
                return true;
            }
            if (!(obj instanceof Person)) {
             
                return false;
            }
            Person other = (Person) obj;
            return this.name.equals(other.name) && this.age == other.age;
        }
      }
      
    • 可以创建两个Person对象:Person p1 = new Person("Alice", 20);和Person p2 = new Person("Bob", 20);。这两个对象的hashCode()方法返回相同的值(因为它们的age都是20),但是它们的equals()方法返回false,因为name属性不同。

所以,两个对象的hashCode()相同,则equals()方法不一定返回true。

相关文章
|
容器
Thymeleaf $/*/#/@语法
Thymeleaf $/*/#/@语法
587 0
|
安全 架构师 Java
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
612 4
|
缓存 Java 测试技术
分享干货:idea常用快捷键分类总结(适合速查~~建议收藏♥)
本文以分类的形式总结了IDEA常用、好用快捷键,全是干货~
6561 2
分享干货:idea常用快捷键分类总结(适合速查~~建议收藏♥)
|
NoSQL Redis 数据库
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
682 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
|
SQL Java 数据库连接
快速搭建SSM项目【最全教程】~令狐小哥版
快速搭建SSM项目【最全教程】~令狐小哥版
1377 1
|
Java 程序员
Java多线程基础-16:简述Java并发编程JUC中的Callable接口
Callable接口是Java中用于描述带有返回值任务的接口,与Runnable相对,后者无返回值。Callable的call()方法用于执行具体任务并返回结果。
782 0
|
SQL 关系型数据库 MySQL
(十八)MySQL排查篇:该如何定位并解决线上突发的Bug与疑难杂症?
前面《MySQL优化篇》、《SQL优化篇》两章中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题。线上排查、性能优化等内容是面试过程中的“常客”,而对于线上遇到的“疑难杂症”,需要通过理性的思维去分析问题、排查问题、定位问题,最后再着手解决问题,同时,如果解决掉所遇到的问题或瓶颈后,也可以在能力范围之内尝试最优解以及适当考虑拓展性。
1965 3
|
关系型数据库 MySQL Linux
在Linux系统上实现高效安装与部署环境的全方位指南
在Linux系统上实现高效安装与部署环境的全方位指南
1156 2
|
消息中间件 NoSQL Java
springboot - 条件注解@ConditionalOnClass原理
springboot - 条件注解@ConditionalOnClass原理
springboot - 条件注解@ConditionalOnClass原理

热门文章

最新文章