个人博客网:https://wushaopei.github.io/    (你想要这里多有)

在创建的类不重写hashCode()和equals() 方法时,默认使用 java 提供的 java.lang.Object 下的 hashCode()和equals() 方法。
> 注意:Object 的public boolean equals(Object obj)方法主要是对非空对象的引用地址的判断相同才返回true,而非对象本身的字符串内容或数值是否相同。

简而言之,当且仅当 值A 和 值B 都是引用自同一个对象时,此方法才会返回true;

所以,当我们重写一个对象,重写了equals()方法后,通常必须重写 hashCode()方法,以维护 hashCode 方法的常规协定,该协定声明了相等对象必须具有相等的哈希码。
> 说白了,就是equals 返回true的两个值,在hashCode() 中结果也必然是true。

*例子:*
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false

这里引出一个问题,为什么要重写equals()方法呢?难道原生的不能用吗?

答案是必须重写,从前面的注意事项中可以知道,如果不重写equals 方法,那么比较的将是对象的引用是否指向同一块内存地址,而我们重写的*目的*是为了能够比较两个对象的value值是否相等。

在高级类的八个包装类与引用类型的String类型(该类对euqals和hashcode方法进行了重写)中都 是使用重写后的 equals 方法来比较对象的,*默认*比较的是值,在*比较其它自定义对象*时都是比较的引用地址。

后面会对equals 和 hashcode 的关系进行关联解释。

*hashcode*是用于散列数据的快速存取,如利用*HashSet/HashMap/Hashtable*类来存储数据时,都是根据存储对象的*hashcode*值来进行判断是否*相同*的。

那么,如果我们值重写equals ,而不重写 hashcode 会怎么样?

如果我们对一个对象重写了equals 方法,意味着只要对象的成员变量值都相等那么equals 就返回true ,但在不重写 hashcode 方法的情况下,当我们重新 new 了一个新对象。
此时,当原对象.equals(新对象)等于true时,两者的 hashcode 却是不一样的,由此会产生了理解的不一致,也违反了equals 与 hashcode的约定规则。

不重写导致的结果案例:

在不重写hashcode的情况下,如果 hashset存储两个引用不同但值相同的对象,此时hashcode返回false,认为后者与前者不重复,则会重新 newNode() 创建一个新节点将重复的值添加到集合中,意味着不可重复的单列集合中出现了两个值一样的对象,导致混淆。(假设没有重写)

所以,需要重写 hashcode()方法。

面试题:我们重写一个对象的时候为什么要同时重写hashcode()和equals()方法的更多相关文章

  1. 重写hashcode和equals方法

    重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...

  2. 用HashSet的add方法谈hashcode和equals方法重写

    本文主要通过用HashSet的add方法讲一下hashCode和equals方法重写.错误的地方望指正. 1.了解HashSet的add方法 了解一个方法的好办法是看源码,所以先看源码 private ...

  3. 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。

    我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...

  4. 【转】 如何重写hashCode()和equals()方法

    转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...

  5. 如何重写hashCode()和equals()方法

    hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equal ...

  6. Java 重写 hashCode() 和 equals() 方法

    1. hashCode 1.1 基本概念 hashCode 是 JDK 根据对象的地址算出来的一个 int 数字(对象的哈希码值),代表了该对象再内存中的存储位置. hashCode() 方法是超级类 ...

  7. (转)为什么要重写 hashcode 和 equals 方法?

    作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...

  8. 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重

    Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不 ...

  9. Java中Set的contains()方法——hashCode与equals方法的约定及重写原则

    转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...

随机推荐

  1. 玩转FPGA边缘视觉——4k视频图像抓取

    随着现代图像及视频处理技术的不断发展,人们对图像处理提出了新的要求,最近几年,图像的分辨率和扫描频率都有了较大范围的提升,1080P分辨率的视频已经非常流行,2K甚至4K分辨率的图像也在火热发展中. ...

  2. mysql计算

    select @csum := 0;select create_time,merchant_id,award as 奖励,total_count as 数量,(@csum := @csum + awa ...

  3. tp5.1的事务操作

    普通的事务操作很简单,最简单的方式是使用 transaction 方法操作数据库事务, 当闭包中的代码发生异常会自动回滚, 例如: Db::transaction(function () { Db:: ...

  4. Codeforces 1272E (Nearest Opposite Parity,反向建边)

    题意:给你n个数,每个数的值为a[i],每个点可以从i这号点跳转至(i - a[i]) 或 (i + a[i])点,点的范围为[1,n],然后问的是从偶数点跳至奇数点,从奇数点跳至偶数点的最少次数是多 ...

  5. 手把手教系列之IIR滤波器设计

    [导读]:在嵌入式系统中经常需要采集模拟信号,采集模拟信号的信号链中难免引入干扰,那么如何滤除干扰呢?今天就来个一步一步描述如何设计部署一个IIR滤波器到你的系统. 何为IIR滤波器? 无限冲激响应( ...

  6. c#word文档输出

    在工作中有时需要把内容用word文档展示出来 在写代码前要引用word的dll Microsoft.Office.Interop.Word“ sing System; using System.Col ...

  7. 朴实的聊聊很多人会误解/不懂的Java并发中断机制

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...

  8. 14.1 Go数据结构

    14.1 Go数据结构 每一个程序都在学习十八般武艺,学习语言.数据库.HTTP等技能. 而程序中的九阳神功就是数据结构与算,掌握了数据结构与算法,你的内功修炼就会有质的飞跃. 无论从事业务开发,测评 ...

  9. js中获取 table节点各tr及td的内容方法

    js中获取 table节点各tr及td的内容方法 分类: java基础2013-10-12 17:54 1055人阅读 评论(0) 收藏 举报 <table id="tb1" ...

  10. iframe中请求页面而session失效时页面跳转问题

    iframe中请求页面而session失效时页面跳转问题 分类: Web2009-12-11 15:01 656人阅读 评论(0) 收藏 举报 sessioniframejsp 有时候做了就忘了,我记 ...