equal、hashcode、==
1、==
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型
byte,short,char,int,long,float,double,boolean 他们之间
的比较,应用双等号(==),比较的是他们的值。
2.引用类型(类、接口、数组)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。
2、equals
1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。定义的equals与==是等效的
2.要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。
3.hashCode的作用
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
虽然,每个Java类都包含hashCode() 函数。但是,仅仅当创建某个“类的散列表”(关于“散列表”见下面说明)时,该类的hashCode() 才有用(作用是:确定该类的每一个对象在散列表中的位置;其它情况下(例如,创建类的单个对象,或者创建类的对象数组等等),类的hashCode() 没有作用。
上面的散列表,指的是:Java集合中本质是散列表的类,如HashMap,Hashtable,HashSet。
也就是说:hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。
OK!至此,我们搞清楚了:hashCode()的作用是获取散列码。
equal和hashcode的关系
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
关于这两个方法的重要规范:
规范1:若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。
规范2:如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。
为什么覆盖equals时总要覆盖hashCode
一个很常见的错误根源在于没有覆盖hashCode方法。在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable。
1.在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。
2.如果两个对象根据equals()方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。
3.如果两个对象根据equals()方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生相同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表的性能。
equal、hashcode、==相关推荐
- Java基础(equcals、hashcode、to String)
java基础 一.关于上课留的问题 ① equcals方法 equcals是一种默认的判断两个对象是否相等的方法存在Object类中定义,通过比较对象的关键成员变量来判断是否相等并返回一个boolea ...
- 【C#公共帮助类】给大家分享一些加密算法 (DES、HashCode、RSA、AES等)
http://www.cnblogs.com/yuangang/p/5466068.html 转载于:https://www.cnblogs.com/daming1233/p/6704562.html
- [JAVA EE] JPA 技术实践:完成增、删、改、查操作
项目已上传:https://codechina.csdn.net/qq_36286039/javaee 注意本项目是包含后文JPA 查询用法内容的,若您想看只有本文内容的项目,请下载: https:/ ...
- Java基础、多线程、JVM、集合八股文自述(持续更新)
Java基础.多线程.JVM.集合八股文自述 一.Java基础 1.1 object类有哪些方法? getClass().hashCode().equals().clone().toString(). ...
- Java JDK代理、CGLIB、AspectJ代理分析比较
前言 什么是代理,在Design patterns In java这个本书中是这样描述的,简单的说就是为某个对象提供一个代理,以控制对这个对象的访问.在不修改源代码的基础上做方法增强,代理是一种设计模 ...
- 继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
这篇博客将会涉及到: 继承的概念和实现 super关键字 方法重写-Override Object常见方法 继承的概念: 生活中,继承的概念随处可见,继承需要符合的关系:is-a:父类更通用.子类更特 ...
- Java学习日报—注解、Hash、Lombok—2021/12/02
目录 1 相关注解 1.1 @Controller 和 @RestController 1.2 @ApiIgnore 1.3 @PostMapping 2 Java知识点 2.1 instanceof ...
- JavaSE----常用类(Object、Objects、Math)
java.lang.Object类的说明: equals() . toString() . getClass() . hashCode() . clone() . finalize() . wait( ...
- Lombok简介、使用、工作原理、优缺点(转载)
文章转载:https://www.jianshu.com/p/453c379c94bd Lombok简介.使用.工作原理.优缺点 1.Lombok简介 官方介绍 Project Lombok is a ...
最新文章
- mysql+数据库连接标识_新人必看!连接到MySQL数据库的两种方法
- python中获取python版本号的方法
- 老男孩python全栈开发视频教程_老男孩Python全栈开发(92天全)视频教程 自学笔记16...
- 翻转棋游戏c语言讲解,有没有人懂黑白棋(翻转棋)的核心算法
- spring boot在运行测试类Error creating bean with name ‘serverEndpointExporter‘ defined...问题解决方案
- 用BeautifulSoup来写python爬虫
- 英特尔傲腾内存linux,英特尔傲腾内存怎么样?intel傲腾内存优点和缺点你知道吗?...
- python Requests登录GitHub
- java filter过滤器_JavaWeb之 Filter(过滤器)
- 两个服务器之间怎么传输大量数据速度快 java socket_千兆网络的传输速度能超过125MB/s么?...
- rabbitmq添加user及vhost
- server sql 数据总行数_一种快速统计SQL Server每个表行数的方法
- java 简易扫雷_JAVA基础课程设计 简易扫雷
- G120变频器如何通过BOP-2操作面板或Startdrive复位出厂参数?
- 计算机管理用房设置要求,党政机关办公用房管理系统解决方案
- c语言课程设计酒店管理系统实验报告 免费下载,C语言酒店管理系统设计
- 51单片机智能小车蓝牙
- 编辑邮件时去掉回车光标跟随
- pythonqq机器人酷q_NoneBot+酷Q,打造QQ机器人
- 关闭wps热点及广告弹窗推送