阿里巴巴开发规范

只要重写 equals,就必须重写 hashCode

因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法

如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals

  Object作者建议

相同的对象必然是相同的哈希值,不同的哈希值是不同的对象

在开发规范和Object作者建议 中都是只要重写 equals, 就必须重写 hashCode 为什么?

要明白重写equals的原因要先明白equals是什么,与之关联的 ==,hashCode又是什么?

== :是对于基本数据类型的值比较

equals :定义在JDK的Object.java中 这就意味着Java中的任何类都包含有equals()函数

equals默认下情况比较两个对象的地址是否相同   如果对象重写了equals()方法,比较两个对象的内容是否相等

但很多类都重写了equals方法,像String,基本数据的包装类等把他变成了值比较 所以一般情况下equals比较的是值是否相等

hashCode :hashCode() 定义也在JDK的Object.java中

hashCode() 的作用是获取哈希码,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

hashCode() 和 equals() 有什么关系?

有关系,但不能说完全有关系  以“类的用途”分2种情况来说明

类对应的散列表(散列表就是同时运用了数组和链表 如 HashMap,HashSet,HashTable等这些本质是散列表的数据结构中)

1 不会创建“类对应的散列表”

在这种情况下,该类的“hashCode() 和 equals() ”是没有任何关系的 equals() 用来比较该类的两个对象是否相等,而hashCode() 则根本没有任何作用

可以看到equals是相等的,但hashCode值是不同的,在这种情况下hashCode值是没有任何作用的

2  会创建“类对应的散列表”

  在这种情况下,该类的“hashCode() 和 equals() ”是有关系的: 如果两个对象相等,那么它们的hashCode()值一定相同。

这里的相等是指,通过equals()比较两个对象时返回true。

  如果两个对象hashCode()相等,它们并不一定相等。因为在散列表中,hashCode()相等,即两个键值对的哈希值相等。

然而哈希值相等,并不一定能得出键值对相等,此时就出现所谓的哈希冲突场景。也就是Set 存储的是不重复的对象

(hashSet底层是hashMap)

   所以说在散列表中  如果重写了 equals() 而未重写 hashcode() 方法,可能就会出现两个没有关系的对象 equals 相同

(因为equal都是根据对象的特征进行重写的),但 hashcode 不相同的情况, 因为在散列表数据结构中要保持key值的唯一,

不然会进行覆盖,通过equals来比较两个key是否相同,也能达到要求,只不过就要和map中的key一个一个的用equals比较,

如果map中有很多元素了,那么效率可能会很低,hashCode方法是根据对象的内存地址经过哈希算法(数据压缩技术,尽量分散

减少哈希冲突)得来的 使用hashCode的一个目的是“分组”,同一个链表上的key的 hashcode是一样的,如果不重写hashcode,

那么两个相同内容的对象,就会放在不同的链表上,那么就会存在两个相同的key。所以就要重写hashcode,

保证有相同内容的对象有相同的hashcode。而且hashcode的结果跟对象的属性有关。如果属性不参与hashcode的计算,

那么这个hash算法就无意义。

如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals

这个就是开发规范和Object作者建议的原因

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

  1. 为什么重写了equals() 就要重写hashcode()

    规定:1.两个对象相等,则hashcode也一定是相等的:2.两个对象相等,对两个对象分别调用equals()都返回 true:3.两个对象有相同的hashcode,但不一定相等 为什么重写了equa ...

  2. 为什么重写equals还要重写hashcode??

    equals和hashcode是object类下一个重要的方法,而object类是所有类的父类,所以所有的类都有这两个方法 equals和hashcode间的关系: 1.如果两个对象相同(即equal ...

  3. 【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明

    在项目开发中,我们都有这样的经历,就是在新增表时,会相应的增加java类,在java类中都存在常见的几个方法,包括:equals(),hashcode(),toString() ,compareto( ...

  4. 为什么重写equals必须重写hashCode

    目录 equals常见面试题 为什么要重写equals 重写equals不重写hashCode会存在什么问题 总结 equals常见面试题 在开始聊之前,我们先看几个常见的面试题,看看你能不能都回答上 ...

  5. 为什么重写equals必须重写hoshCode的基础分析

    为什么重写equals必须重写hoshCode的基础分析 1.我们先来了解下原生的equals和hashCode代码 原生equals:它判断的是两个对象是否相等 原生hashCode值:它是根据内存 ...

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

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

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

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

  8. 为什么重写equals()必须重写hashCode()

    主要原因是因为hashCode是用对象的内部地址转换成一个整数的,而equals比较得是两个对象,或者是两个对象的内容 如果你重写了equals,而保留hashCode的实现不变,那么很可能两个对象明 ...

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

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

随机推荐

  1. 论文解读(LLE)《Nonlinear Dimensionality Reduction by Locally Linear Embedding》and LLE

    论文题目:<Nonlinear Dimensionality Reduction by Locally Linear Embedding > 发表时间:Science  2000 论文地址 ...

  2. [loj3146]路灯

    显然,能从$l$到$r$当且仅当$[l,r)$中的灯全部都亮,以下不妨令询问的$r$全部减1 当修改节点$x$时,找到包含$x$的极大的灯(除$x$以外)全部都亮的区间$[l,r]$,即令$l_{0} ...

  3. [cf674E]Bear and Destroying Subtrees

    令$f_{i,j}$表示以$i$为根的子树中,深度小于等于$j$的概率,那么$ans_{i}=\sum_{j=1}^{dep}(f_{i,j}-f_{i,j-1})j$ 大约来估计一下$f_{i,j} ...

  4. Android系统编程入门系列之硬件交互——多媒体摄像头

    多媒体系列硬件 多媒体包括图片.动画.音频.视频,这些多媒体素材的采集(输入)主要依靠摄像头和麦克风等硬件设备转化为基础数据,而他们的播放渲染(输出),则需要依靠具有相关功能的编解码软件.当然随着硬件 ...

  5. 《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)

    1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast,那么这个toast我们这边如何进行测试呢?今天宏哥就分两篇介绍一下. ...

  6. [APIO2020]有趣的旅途

    注意到第一个点是可以钦定的. 那么我们考虑在重心的子树里反复横跳. 每次选择不同子树里的深度最大的点. 在同一颗子树里可能会在lca处出现问题. 那么我们选择重心,要考虑到会不会出现一颗子树不够选的操 ...

  7. Atcoder Beginner Contest 164 E Two Currencies(拆点+最短路)

    题目链接 题意:有 \(n\) 个城市,它们由 \(m\) 条双向道路连接,保证它们能够彼此到达.第 \(i\) 条道路连接 \(u_i,v_i\),需要花费 \(x_i\) 个银币,耗费 \(t_i ...

  8. dokuwiki使用随笔

    1. 在dokuwiki上安装MataJax插件后: a. $....$:之间书写数学公式;如完全平方公式:$a^2+b^2+2ab$,该公式将与当前行文字处于同一行; b. $$ .... $$ 之 ...

  9. python飞机大战

    '''新手刚学python,仿着老师敲的代码.1.敌方飞机只能左右徘徊(不会往下跑)并且不会发射子弹.2.正在研究怎么写计分.3.也参考了不少大佬的代码,但也仅仅只是参考了.加油!''' import ...

  10. 『学了就忘』Linux文件系统管理 — 66、通过图形界面进行LVM分区

    目录 1.选择自定义分区 2.分配boot分区 3.创建LVM物理卷 4.生成卷组 5.创建逻辑卷 6.格式化安装 我们先用新安装Linux系统时的图形化界面,来演示一下LVM逻辑卷如何进行分区. 提 ...