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、==相关推荐

  1. Java基础(equcals、hashcode、to String)

    java基础 一.关于上课留的问题 ① equcals方法 equcals是一种默认的判断两个对象是否相等的方法存在Object类中定义,通过比较对象的关键成员变量来判断是否相等并返回一个boolea ...

  2. 【C#公共帮助类】给大家分享一些加密算法 (DES、HashCode、RSA、AES等)

    http://www.cnblogs.com/yuangang/p/5466068.html 转载于:https://www.cnblogs.com/daming1233/p/6704562.html

  3. [JAVA EE] JPA 技术实践:完成增、删、改、查操作

    项目已上传:https://codechina.csdn.net/qq_36286039/javaee 注意本项目是包含后文JPA 查询用法内容的,若您想看只有本文内容的项目,请下载: https:/ ...

  4. Java基础、多线程、JVM、集合八股文自述(持续更新)

    Java基础.多线程.JVM.集合八股文自述 一.Java基础 1.1 object类有哪些方法? getClass().hashCode().equals().clone().toString(). ...

  5. Java JDK代理、CGLIB、AspectJ代理分析比较

    前言 什么是代理,在Design patterns In java这个本书中是这样描述的,简单的说就是为某个对象提供一个代理,以控制对这个对象的访问.在不修改源代码的基础上做方法增强,代理是一种设计模 ...

  6. 继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类

    这篇博客将会涉及到: 继承的概念和实现 super关键字 方法重写-Override Object常见方法 继承的概念: 生活中,继承的概念随处可见,继承需要符合的关系:is-a:父类更通用.子类更特 ...

  7. Java学习日报—注解、Hash、Lombok—2021/12/02

    目录 1 相关注解 1.1 @Controller 和 @RestController 1.2 @ApiIgnore 1.3 @PostMapping 2 Java知识点 2.1 instanceof ...

  8. JavaSE----常用类(Object、Objects、Math)

    java.lang.Object类的说明: equals() . toString() . getClass() . hashCode() . clone() . finalize() . wait( ...

  9. Lombok简介、使用、工作原理、优缺点(转载)

    文章转载:https://www.jianshu.com/p/453c379c94bd Lombok简介.使用.工作原理.优缺点 1.Lombok简介 官方介绍 Project Lombok is a ...

最新文章

  1. mysql+数据库连接标识_新人必看!连接到MySQL数据库的两种方法
  2. python中获取python版本号的方法
  3. 老男孩python全栈开发视频教程_老男孩Python全栈开发(92天全)视频教程 自学笔记16...
  4. 翻转棋游戏c语言讲解,有没有人懂黑白棋(翻转棋)的核心算法
  5. spring boot在运行测试类Error creating bean with name ‘serverEndpointExporter‘ defined...问题解决方案
  6. 用BeautifulSoup来写python爬虫
  7. 英特尔傲腾内存linux,英特尔傲腾内存怎么样?intel傲腾内存优点和缺点你知道吗?...
  8. python Requests登录GitHub
  9. java filter过滤器_JavaWeb之 Filter(过滤器)
  10. 两个服务器之间怎么传输大量数据速度快 java socket_千兆网络的传输速度能超过125MB/s么?...
  11. rabbitmq添加user及vhost
  12. server sql 数据总行数_一种快速统计SQL Server每个表行数的方法
  13. java 简易扫雷_JAVA基础课程设计 简易扫雷
  14. G120变频器如何通过BOP-2操作面板或Startdrive复位出厂参数?
  15. 计算机管理用房设置要求,党政机关办公用房管理系统解决方案
  16. c语言课程设计酒店管理系统实验报告 免费下载,C语言酒店管理系统设计
  17. 51单片机智能小车蓝牙
  18. 编辑邮件时去掉回车光标跟随
  19. pythonqq机器人酷q_NoneBot+酷Q,打造QQ机器人
  20. 关闭wps热点及广告弹窗推送

热门文章

  1. 在命令行中管理 Wifi 连接
  2. java == 与 equals 相同与不同点
  3. Android数据库--Sqlcipher的使用(一)
  4. IL入门之旅(三)——Dump对象
  5. 产生指定长度的随机字符串
  6. 基于TensorFlow的2个机器学习简单应用实例
  7. 使用librdkafka的C++接口实现简单的生产者和消费者
  8. 关于vector的resize()的理解
  9. Nginx简介及使用Nginx实现负载均衡的原理【通俗易懂,言简意赅】
  10. python dlib学习(一):人脸检测