为什么要重写equals()?

Equals和 == 的区别:

  • ==:是个运算符, 判断是否相等,基本数据类型进行判断

    也可判断两个对象相等,比较两个对象的哈希码值
  • Equals:是个Object类的方法,只能够判断对象是否相等,不能对基本数据类型进行判断

    如果没重写, 等价于a==b,但是重写之后,有自己的判断依据
  • String和StringBuffer的区别

共同点: 都是常见的字符串处理类

区别:String是个final类,属性也用final修饰,对象的值不允许发生变化。

StringBuffer对象的值允许发生变化

使用场景:

  • 1.如果想把持久类的实例放入set中(多值关联时,1对多),建议实现equals和hashcode

  • 2.想重用托管实例时,也要实现equals和hashcode

  • 3.多个字段组合作为联合主键,必须实现equals和hashcode方法

从属关系

  • equals()和hashCode()这两个方法属于Object类,
  • 而Object类是所有类的父类,因此所有的类都继承了这两个方法。

在API中:

* public boolean equals(Objectobj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;

* 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

* public int hashCode() 返回该对象的哈希码值。支持该方法是为哈希表提供一些优点。

思路分析:

  • 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,

  • 重写之后目的是为了比较两个对象的value值是否相等。

  • 特别指出,此时,利用equals比较八大包装对象(如int,float等)

  • 和String类(因为该类已重写了equals和hashcode方法)对象时,

  • 默认比较的是值,在比较其它对象都是比较的引用地址。

为什么要重写hashcode呢?

  • 利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。

  • 这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,

  • 但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,

  • 两者的hashcode却是不一样的,由此将产生了理解的不一致。

  • 将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode。

判断两个对象是否相等的规则:

  • 如果两个对象哈希值不同,那么这两个对象不相等。
  • 如果相同,则调用equals()方法判断,
  • 如果equals()方法返回true,则这两个对象相等,否则不相等。
  • 为了保证这种一致性,必须满足以下两个条件:

    (1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true

    (2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false

为什么要重写equals()?的更多相关文章

  1. 为什么重写equals时必须重写hashCode方法?

    原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html 首先我们先来看下String类的源码:可以发现Stri ...

  2. java重写equals方法

    @Override public int hashCode() { return task.getId(); } @Override public boolean equals(Object obj) ...

  3. 重写Equals为什么要同时重写GetHashCode

    .NET程序员都知道,如果我们重写一个类的Equals方法而没有重写GetHashCode,则VS会提示警告 :“***”重写 Object.Equals(object o)但不重写 Object.G ...

  4. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)

    Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例  原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...

  5. 【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

    原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http ...

  6. 重写equals()方法时,需要同时重写hashCode()方法

    package com.wangzhu.map; import java.util.HashMap; /** * hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,<br/&g ...

  7. 为什么重写equals方法还要重写hashcode方法?

    我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写 ...

  8. 为什么要重写equals()方法与hashCode()方法

    在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写equals方法我们是继承了object ...

  9. RemoveAll 要重写equals方法

    public class User { private String name; private int age; //setter and getter public String getName( ...

  10. Hibernate中为什么要重写equals方法和hashcode方法

    1.*为什么要重写equals方法,首先我们来看一下equals源码: public boolean equals(Object anObject) { if (this == anObject) { ...

随机推荐

  1. 【krpano】KRPano打开黑屏: FATAL ERROR

    在KRPano开发过程中,初学者打开项目经常遇到如下的问题: FATAL ERROR:tour.xml – loading failed! (0) 或者是: ERROR:Local usage wit ...

  2. 【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅

    前言 缘由 博友的需求就是我最大的动力 博友一说话,本狗笑哈哈.博友要我写啥,我就写啥. 特来一篇关于SpringBoot接口返回结果及异常统一处理,虽说封不封装都能用,但咱后端也得给前端小姐姐留个好 ...

  3. 「joisc2016 - D3T2」回転寿司

    题意大概是这样,「每次操作选出区间中的一个 LIS(strictly),满足其开端是极靠近左端点且大于 \(A\) 的位置,答案即这个 LIS 的末尾,做一个轮换后弹出序列末端」. 首先做几个观察. ...

  4. Oracle存储函数写法及调用

    1.右键导航创建函数界面 2.返回值FunctionResult可自定义,当函数有输出函数时可不传数据,但需要设置返回(当提示未限定返回长度时,如代码示例设置255长度皆可): -------使用函数 ...

  5. 2020/5/8—cf,我裂开来

    呜呜呜我爆零了呜呜呜ljll 嗯T1T2防爆零的没了呜呜呜在此纪念可怜的yjz大佬21发AC 太惨了(逃 先来说说我们都有些啥题目吧... T1 嗯,裂开了,当场裂开我一看!桶排!然后实现,嗯?嗯!嗯 ...

  6. 如何将linux设置成网关

    如何将linux设置成网关 打开网关linux的端口转发功能:echo '1' > /proc/sys/net/ipv4/ip_forward 在VMWare中创建一个仅主机的内网: 进入本机配 ...

  7. 从零用VitePress搭建博客教程(2) –VitePress默认首页和头部导航、左侧导航配置

    2. 从零用VitePress搭建博客教程(2) –VitePress默认首页和头部导航.左侧导航配置 接上一节: 从零用VitePress搭建博客教程(1) – VitePress的安装和运行 四. ...

  8. P1182 数列分段 Section II 题解

    Problem 考察知识点:二分.贪心. 题目描述 对于给定的一个数组,现要将其分成 \(M\) 段,并要求每段连续,且每段和的最大值最小. 思路 二分答案出每段和最大值的最小值,然后贪心检验是否满足 ...

  9. Go 方法集合与选择receiver类型

    Go 方法集合与选择receiver类型 目录 Go 方法集合与选择receiver类型 一.receiver 参数类型对 Go 方法的影响 二.选择 receiver 参数类型原则 2.1 选择 r ...

  10. 如何赋予 GPT/LLM 自我意识1

    引子 这个周末OpenAI搞了一个大新闻,围绕 Sam Altman 和 Ilya Sutskever 的各种讨论遍地开花,而其中一个关注点就是他们对于 AGI 降临态度上的偏差.本文不打算讨论公司治 ...