哈希娱乐 行业新闻 党建先锋

Java基础不简单谈谈hashCode()和e哈希娱乐quals()之间的关系

发布时间:2025-10-14 17:14:32  浏览:

  哈希游戏作为一种新兴的区块链应用,它巧妙地结合了加密技术与娱乐,为玩家提供了全新的体验。万达哈希平台凭借其独特的彩票玩法和创新的哈希算法,公平公正-方便快捷!万达哈希,哈希游戏平台,哈希娱乐,哈希游戏Java基础不简单,谈谈hashCode()和equals()之间的关系

  本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

  其实很早我就注意到阿里巴巴Java开发规范有一句话:只要重写 equals,就必须重写 hashCode。

  我想很多人都会问为什么,所谓知其然知其所以然,对待知识不单止知道结论还得知道原因。

  学过数据结构的都知道,哈希码的作用是确定对象在哈希表的索引下标。比如HashSet和HashMap就是使用了hashCode方法确定索引下标。如果两个对象返回的hashCode相同,就被称为“哈希冲突”。

  equals()方法的作用很简单,就是判断两个对象是否相等,equals()方法是定义在Object类中,而所有的类的父类都是Object,所以如果不重写equals方法则会调用Object类的equals方法。

  Object类的equals方法是用“==”号进行比较,在很多时候,因为==号比较的是两个对象的内存地址而不是实际的值,所以不是很符合业务要求。所以很多时候我们需要重写equals方法,去比较对象中每一个成员变量的值是否相等。

  因为HashSet、HashMap底层在添加元素时,会先判断对象的hashCode是否相等,如果hashCode相等才会用equals()方法比较是否相等。换句话说,HashSet和HashMap在判断两个元素是否相等时,会先判断hashCode,如果两个对象的hashCode不同则必定不相等。

  下面我们做一个试验,有一个User类,只重写equals()方法,然后放到Set集合中去重。

  然后我们循环创建10个成员变量的值都是一样的User对象,最后放到Set集合中去重。

  按道理我们预期会去重,只剩下一个“张三”的user,但实际上因为没有重写hashCode方法,所以没有去重。

  究其原因在于HashSet会先判断hashCode是否相等,如果hashCode不相等就直接认为两个对象不相等,不会再用equals()比较了。我们不妨看看重写hashCode方法和不重写hashCode方法的哈希码。

  这是不重写hashCode方法的情况,每个user对象的哈希码都不一样,所以HashSet会认为都不相等。

  这是重写hashCode方法的情况,因为是用对象所有的成员变量的值计算出的哈希码,所以只要两个对象的成员变量都是相等的,则生成的哈希码是相同的。

  那么有些人看到这里,就会问,如果两个对象返回的哈希码都是一样的话,是不是就一定相等?

  答案是不一定的,因为HashSet、HashMap判断哈希码相等后还会再用equals()方法判断。

  所以回到开头讲的那句,只要重写 equals,就必须重写 hashCode,这是一个很重要的细节,如果不注意的话,很容易发生业务上的错误。

  特别是有时候我们明明用了HashSet,distinct()去重,但是就是不生效,这时应该回头看看重写了equals()和hashCode()方法了吗?

  本文深入探讨了Java中`equals`方法的设计与实现。默认情况下,`equals`仅比较对象引用是否相同。以`String`类为例,其重写了`equals`方法,通过引用判断、类型检查、长度对比及字符逐一比对,确保内容相等的逻辑。文章还强调了`equals`方法需遵循的五大原则(自反性、对称性等),以及与`hashCode`的关系,避免集合操作中的潜在问题。最后,对比了`instanceof`和`getClass()`在类型判断中的优劣,并总结了正确重写`equals`方法的重要性,帮助开发者提升代码质量。

  java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)

  这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。

  【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)

  String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射

  为什么在 Java 中重写 equals 时需要重写 hashcode?

  这篇文章区分了Java中的`==`运算符和`equals()`方法:`==`用于基本数据类型时比较值是否相等,用于引用类型时比较内存地址是否相同;而`equals()`默认实现按内存地址比较,但通常被重写以根据对象内容比较是否相等。

  【Java基础面试二十二】、为什么要重写hashCode()和equals()?

  这篇文章解释了为什么需要重写`hashCode()`和`equals()`方法:因为Object类的`equals()`默认使用`==`比较,这在业务中通常是不够的,我们需要根据对象内容来比较相等性;同时,为了保持`hashCode()`与`equals()`的联动关系,一旦重写了`equals()`,通常也需要重写`hashCode()`。

  【Java基础面试二十一】、说一说hashCode()和equals()的关系

  这篇文章讨论了Java中`hashCode()`和`equals()`方法之间的关系,强调如果两个对象相等,它们必须有相同的哈希码,但有相同哈希码的对象未必相等,并解释了这一关系在HashSet集合中判断元素是否重复的应用场景。

  Java:如何重写 `equals()` 和 `hashCode()` 方法

  阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~

  构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用

  热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南

  使用LangChain4j构建Java AI智能体:让大模型学会使用工具

  Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手

  抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发

  java 入门学习视频_2025 最新 java 入门零基础学习视频教程

  顺丰同城抢单辅助脚本,顺丰骑士抢单辅助免封号,自动抢单神器【java版开源】

  MinIO Java SDK 7.1.4 升级到 8.5.17 需要注意什么

  Spring Cloud Alibaba - 重新定义 Java Cloud-Native