1.equals()方法和hashCode()方法是什么?

equals()和hashCode()都是是Java中万物之源Object类中的方法;

equals方法用于比较两个对象是否相同,Object类中equals方法的实现是比较引用地址来判断的对象是否是同一个对象,通过覆盖该方法可以实现自定义的判断规则;

hashCode是jdk根据对象的地址或者字符串或者数字计算该对象的哈希码值的方法。

2.为什么要重写equals()方法?

Object类中equals方法比较的是两个对象的引用地址,只有对象的引用地址指向同一个地址时,才认为这两个地址是相等的,否则这两个对象就不想等。

如果有两个对象,他们的属性是相同的,但是地址不同,这样使用equals()比较得出的结果是不相等的,而我们需要的是这两个对象相等,因此默认的equals()方法是不符合我们的要求的,这个时候我们就需要对equals()方法进行重写以满足我们的预期结果。

在java的集合框架中需要用到equals()方法进行查找对象,如果集合中存放的是自定义类型,并且没有重写equals()方法,则会调用Object父类中的equals()方法按照地址比较,往往会出现错误的结果,此时我们应该根据业务需求重写equals()方法。

3.为什么要重写hashCode()方法?

hashCode()方法用于散列数据的快速存储,HashSet/HashMap/Hashtable类存储数据时都是根据存储对象的hashcode值来进行分类存储的,一般先根据hashcode值在集合中进行分类,在根据equals()方法判断对象是否相同。

HashMap对象是根据其Key的hashCode来获取对应的Value。

生成一个好的hashCode值能提高HashSet查找的性能,差的hashCode值不但不能提高性能,甚至可能造成错误。比如hashCode方法中返回常量,会让,HashSet的查找效率退化为List集合的查找效率;hashCode方法中返回随机数,会让查找结果变的不可预测。

好的hashCode生成方式是让对象中的关键属性与质数相乘,并将积相加获取。

4.为什么java中在重写equals()方法后必须对hashCode()方法进行重写?

为了维护hashCode()方法的equals协定,该协定指出:如果根据 equals()方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode方法都必须生成相同的整数结果;而两个hashCode()返回的结果相等,两个对象的equals()方法不一定相等。

HashMap对象是根据其Key的hashCode来获取对应的Value。

在重写父类的equals()方法时,也重写hashcode()方法,使相等的两个对象获取的HashCode值也相等,这样当此对象做Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。

5.重写equals()方法:

重写equals方法需要遵循Java如下规则,否则编码行为会难以揣测:

自反性:对于任意的对象x,x.equals(x)返回true(自己一定等于自己);

对称性:对于任意的对象x和y,若x.equals(y)为true,则y.equals(x)亦为true;

传递性:对于任意的对象x、y和z,若x.equals(y)为true且y.equals(z)也为true,则x.equals(z)亦为true;

一致性:对于任意的对象x和y,x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n次调用也均为true,前提条件是没有修改x也没有修改y;

对于非空引用x,x.equals(null)永远返回为false。

重写代码如下:

@Override

public boolean equals(Object o) {

//自反性

if (this == o) return true;

//任何对象不等于null,比较是否为同一类型

if (!(o instanceof Person)) return false;

//强制类型转换

Person person = (Person) o;

//比较属性值

return getId() == person.getId() &&

Objects.equals(getName(), person.getName()) &&

Objects.equals(getSex(), person.getSex());

}

6.重写hashCode()方法:

HashMap对象是根据其Key的hashCode来获取对应的Value。

在重写父类的equals方法时,也重写hashcode方法,使相等的两个对象获取的HashCode也相等,这样当此对象做Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。

重写hashCode()方法需要遵循hashCode()协定:

一致性:在Java应用程序执行期间,在对同一对象多次调用hashCode方法时,必须一致地返回相同的整数,前提是将对象进行hashcode比较时所用的信息没有被修改。

equals:如果根据equals()方法比较,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode()方法都必须生成相同的整数结果,注:这里说的equals()方法是指Object类中未被子类重写过的equals()方法。

附加:如果根据equals()方法比较,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode方法不一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

重写代码如下:

@Override

public int hashCode() {

return Objects.hash(getId(), getName(), getSex());

}

java重写6,java重写equals()方法和hashCode()方法相关推荐

  1. equals方法和hashCode方法之间的那些事(1.1)

    我们先来看一下java官方 jdk中关于equals方法和hashCode方法的介绍: 不知道读者们注意到一个细节没有,就是: 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 ...

  2. HashSet要重写equals方法和hashCode方法

    注:重要笔记在代码中注释有 hashSet去重: 即判断两个对象是否相等 1:会先调用对象的hashCode方法获得hash的值,如果set中哈希表里面没有对应的hash值,则将次对象存入set中 2 ...

  3. 详解 equals() 方法和 hashCode() 方法

    来源:编程迷思, www.cnblogs.com/kismetv/p/7191736.html 前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,has ...

  4. JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法

    在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address {privat ...

  5. Java equals()方法和hashCode()方法

    equals()方法 如果满足了以下任何一个条件,就不需要覆盖equals()方法: 1 类的每个实例本质上都是唯一的. 2 不关心类是否提供了"逻辑相等"的测试功能. 3 父类已 ...

  6. java中重写hashcode_Java中HashSet要重写equals方法和hashCode方法

    下面给出一个属性不同但哈希码相同的例子: import java.util.HashSet; import java.util.Iterator; import java.util.Set; clas ...

  7. Java基础语法:重写equals方法和hasCode方法

    目录 一.为什么需要重写equals和hasCode方法 二.equals和hasCode解读 1.equals方法 2.hasCode方法 三.重写 四.参考资料 一.为什么需要重写equals和h ...

  8. Java基础提升篇:equals()方法和“==”运算符

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 你所需要的 ...

  9. 普歌-码灵团队-java中的equals方法和toString方法及总结

    普歌-码灵团队:Object类中的方法介绍及其用法 一.Object类 二.方法介绍 1.toString方法 2.重写equals方法: 3. 拓展 三.总结 一.Object类的简单介绍 二.Ob ...

最新文章

  1. 推荐介绍一项新的工程技术:[威胁建模]的相关系列文章《威胁建模Web 应用程序》...
  2. 在SAP BW中使用ABAP
  3. 表情显示服务器异常,MySqlmoji表情引发的存储异常微信昵称
  4. java基础提升篇:synchronized同步块和volatile同步变量
  5. MySQL中的show full columns from 表名
  6. 一个项目部署多个节点会导致锁失效么_Redis分布式锁
  7. 8 一点就消失_消失的莉莉安(25)
  8. 高性能MySQL读书笔记 (五)
  9. python编程例子-Python面向对象编程 - 类和实例
  10. iOS开发之UITextField(输入框)限制只能输入整数和小数
  11. 转载:eclipse 搭建SSH项目(第二篇,有具体的项目例子)
  12. 【Prison Break】第二天(3.28)
  13. 遇到数学问题《深度学习》“花书”读不下去了吗?给你支个招
  14. 郸城二高2021年高考成绩查询,郸城几所高中高考成绩汇总!有你们村的没?
  15. 我的python学习(五)文件操作、异常捕获
  16. uva 10859 放置街灯--Placing Lampposts
  17. ThinkPhp6+Vue直播平台后台管理系统
  18. NVIDIA jetson tensorrt加速yolov5摄像头检测
  19. 完全解读:用最小二乘法求模型参数
  20. 从0开始学习C语言————数组、进制转换、函数

热门文章

  1. Linux复位usb hub,Linux USB subsystem --- USB Hub initialize
  2. 多媒体计算机在英语学科的应用,多媒体计算机应用于初中英语学科学习教学的研究...
  3. ps4修改服务器地区,ps4怎么修改服务器地址
  4. python特征选择工具_一个Python特征选择工具,助力实现高效机器学习
  5. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)
  6. C# 算法题系列(一) 两数之和、无重复字符的最长子串
  7. STM平台增加性能测试/稳定性测试部分【一】
  8. Django模型层的多表操作(2)
  9. Mahout实战---运行第一个推荐引擎
  10. tinyhttp源码阅读(注释)