equals与hashcode的区别与联系

简介: equals与hashcode的区别与联系

1."=="与equals的区别与联系

(1)“==”对于基本数据类型,只要值相等,就返回true,否则返回false。


        若比较的为对象,则判断的是两个对象是否处于同一个内存地址。


(2)equals为Object类中的方法,Object中equals默认使用==来判断,因此一般来讲equals与“==”并无区别,完全相同。


       Object是所有类的父类,在不少类中都对equals进行了重写,比如最常用的String类,因此在String中比较的是值,而非地址。


       基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的


String 中的equals方法

2.equals与hashcode的区别与联系

在Java中判断两个对象是否相等,有两种方法,一种是通过hashcode,另一种是通过equals


hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢?


     因为重写的equal()里一般比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率


这么高为什么还要equal()呢?


    因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对


可靠,所以我们可以得出:


        1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。


        2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。


    所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两


个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了


效率也保证了对比的绝对正确性!


    这种大量的并且快速的对象对比一般使用的hash容器中,比如hashset,hashmap,hashtable等等,比如hashset里要求对象不能重复,则他内部必然要对添加进去的每个对象进行对


比,而他的对比规则就是像上面说的那样,先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高了。

相关文章
|
Java 数据库连接 数据库
❤️爆肝万字!一文最全总结之Spring从入门到入土❤️(建议收藏)
❤️爆肝万字!一文最全总结之Spring从入门到入土❤️(建议收藏)
467 0
|
存储 算法 Java
【算法系列篇】滑动窗口-1
【算法系列篇】滑动窗口-1
|
7月前
|
安全 Java API
Spring Boot 4 升级实战:从3.x到4.0的分步升级保姆级指南
Spring Boot 4.0于2025年11月发布,基于Spring Framework 7.0,实现模块化(47个轻量自动配置)、JSpecify空安全校验、原生API版本控制等重大升级。镜像减19%、启动快33%,迁移平滑,3.5.x支持至2026年11月。(239字)
6542 1
|
存储 Java 索引
java 中为什么重写 equals 后需要重写 hashCode
java 中为什么重写 equals 后需要重写 hashCode
466 8
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
37056 1
|
安全 API Android开发
Android全局广播+本地广播
本文详细介绍了Android中的全局广播与本地广播的使用方法及其注意事项。针对Android 8.0及以上版本广播机制的变化,文章分析了静态注册失效、跨应用广播无法接收及广播接收顺序问题,并提供了相应解决方案,如通过`setPackage()`指定包名和避免静态与动态注册共存。此外,文章还深入讲解了LocalBroadcastManager的使用场景与优势,强调其在应用内通信中的高效性和安全性,同时对比了全局广播与本地广播的区别,为开发者提供了清晰的实践指导。
583 0
|
存储 缓存 前端开发
灵魂拷问-前端的作用--性能优化篇
作者最近在尝试对负责的平台进行性能优化,本文整理了些前端性能优化的一些常见策略。
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。
Java 实现 Elasticsearch 查询全部数据
【7月更文挑战第7天】Java 实现 Elasticsearch 查询全部数据
|
存储 Java
图文并茂:JVM 内存布局详解
图文并茂:JVM 内存布局详解
593 1

热门文章

最新文章