首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

equalshashCode你学会了么?

作为Objectequals方法hashCode方法,或多或少我们子类中都有重写过这两个方法,那么我们重写这两个方法时需要注意些什么?就让我们通过这篇文章来聊一聊。...重写equals方法需要保证equals满足以下特性: 自反性:对于任何null的引用值x,必须满足x.equals(x)返回true 对称性:对于任何null的引用值xy,当且仅当y.equals...最最重要的一步,当编写完equals方法一定要进行单元测试,验证equals方法是否满足上述特性。 hashCode 每个覆盖了equals方法的类,必须重写hashCode方法。...,但是尽量保证程序可以产出不同的整数因为这样可以提高列表的性能 如何写好hashCode 把某个零的常数值,比如说17保存在一个result的int类型变量 对于对象equals方法涉及到的每一个域...(f)计算码 按照result = 31 * result + c(第二步计算的码)合并到result并返回 验证自己的hashCode方法 使用0初始值的原因是让域初始值为0的那些域可以影响到

70420

java集合超详解

,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。...Hash算法是一种算法。...3、尽量的让hashCode开(两值用异或运算可使结果的范围更广) HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,我们应该为保存到...覆盖equals()hashCode()方法时, 要使相同对象的hashCode()方法返回相同值,覆盖equals()方法再判断其内容。...使用HashMap要求添加的键类明确定义了hashCode()equals()[可以重写hashCode()equals()],为了优化HashMap空间的使用,您可以调优初始容量负载因子。

50720
您找到你想要的搜索结果了吗?
是的
没有找到

Java基础面试题-可能读了个假书?

文章目录 Java基础 字符型常量字符串常量 重载重写的区别 成员变量与局部变量 ==equals() hashcode()equals() transient关键字 BIO、NIOAIO Java...重载是同一个类多个同名方法根据不同的传参执行不同的逻辑处理。 重写:是当子类继承自父类的相同方法,输入数据一样,但是要做出的父类不一样的响应时,就要重写父类方法。...hashcode()equals() 你知道为什么重写equals()方法必须重写hashcode()方法?...先介绍下hashcodehashcode()的作用是获取一个int整数即哈希码,也称为码。哈希码是确定对象哈希表的索引位置,Java的所有类都包含该函数。...HashMap底层实现 JDK1.8之前: JDK1.8之前HashMap底层是数组链表结合在一起使用也就是链表,HashMap通过key的hashcode经过扰动函数处理后得到hash值,然后通过

98750

Java集合详解【面试+工作】

我们应该为要存放到列表的各个对象定义hashCode()equals()。 HashSet的equalsHashCode 前面说过,Set集合是不允许重复元素的,否则将会引发各种奇怪的问题。...所以如果要重写保存在HashSet的对象的equals方法,也要重写hashCode方法重写前后hashCode返回的结果相等(即保证保存在同一个位置)。...试想如果重写equals方法但不重写hashCode方法,即相同equals结果的两个对象将会被HashSet当作两个元素保存起来,这与我们设计HashSet的初衷不符(元素不重复)。...覆写equals后,两个不同实例可能在逻辑上相等,但是根据Object.hashCode方法却产生不同的码,违反“相等的对象必须具有相等的码”。...使用HashMap要求添加的键类明确定义了hashCode() equals()的实现。 两个map的元素一样,但顺序不一样,导致hashCode()不一样

1.9K60

对JavaHashCode方法的深入思考

但是 HashCode 方法真的是内存地址?回答这个问题前我们先回顾下一些基础知识。 ==equals Java 中比较两个对象是否相等主要是通过 ==号,比较的是他们在内存的存放地址。...ObjectHashCode equals 方法能比较两个对象的内容是否相等,因此可以用来查找某个对象是否集合容器,通常大致就是逐一去取集合的每个对象元素与需要查询的对象进行equals比较,...从理论上来说如果重写equals 方法而没有重写 hashCode 方法则违背了上述约定的第二条,相等的对象必须拥有相等的值。...但是规则是大家默契的约定,如果我们就喜欢不走寻常路,重写equals 方法后没有覆盖 hashCode 方法,会产生什么后果?...:" + student2.hashCode());} 得到的结果 equals结果:true对象1的值:1058025095,对象2的值:665576141 我们重写equals 方法,根据姓名性别的属性来判断对象的内容是否相等

82620

Java集合必会14问(精选面试题整理)

当两个不同的输入值,根据同一函数计算出相同的值的现象,我们就把它叫做碰撞(哈希碰撞)。 HashMap的数据结构 Java,保存数据有两种比较简单的数据结构:数组链表。...通过上面的链地址法(使用列表)扰动函数我们成功让我们的数据分布更平均,哈希碰撞减少,但是当我们的HashMap存在大量数据时,加入我们某个bucket下对应的链表有n个元素,那么遍历时间复杂度就为...内部已重写equals()、hashCode()等方法,遵守了HashMap内部的规范(不清楚可以去上面看看putValue的过程),不容易出现Hash值计算错误的情况; 面试官:如果我想要让自己的...答:重写hashCode()equals()方法 重写hashCode()是因为需要计算存储数据的存储位置,需要注意不要试图从码计算中排除掉一个对象的关键部分来提高性能,这样虽然能更快但可能会导致更多的...Hash碰撞; 重写`equals()`方法,需要遵守自反性、对称性、传递性、一致性以及对于任何null的引用值x,x.equals(null)必须返回false的这几个特性,目的是为了保证key哈希表的唯一性

47960

Java集合必会14问(精选面试题整理)

当两个不同的输入值,根据同一函数计算出相同的值的现象,我们就把它叫做碰撞(哈希碰撞)。 HashMap的数据结构 Java,保存数据有两种比较简单的数据结构:数组链表。...通过上面的链地址法(使用列表)扰动函数我们成功让我们的数据分布更平均,哈希碰撞减少,但是当我们的HashMap存在大量数据时,加入我们某个bucket下对应的链表有n个元素,那么遍历时间复杂度就为...内部已重写equals()、hashCode()等方法,遵守了HashMap内部的规范(不清楚可以去上面看看putValue的过程),不容易出现Hash值计算错误的情况; 面试官:如果我想要让自己的...答:重写hashCode()equals()方法 重写hashCode()是因为需要计算存储数据的存储位置,需要注意不要试图从码计算中排除掉一个对象的关键部分来提高性能,这样虽然能更快但可能会导致更多的...Hash碰撞; 重写equals()方法,需要遵守自反性、对称性、传递性、一致性以及对于任何null的引用值x,x.equals(null)必须返回false的这几个特性,目的是为了保证key哈希表的唯一性

42020

Java集合必会14问(精选面试题整理)

当两个不同的输入值,根据同一函数计算出相同的值的现象,我们就把它叫做碰撞(哈希碰撞)。 HashMap的数据结构 Java,保存数据有两种比较简单的数据结构:数组链表。...通过上面的链地址法(使用列表)扰动函数我们成功让我们的数据分布更平均,哈希碰撞减少,但是当我们的HashMap存在大量数据时,加入我们某个bucket下对应的链表有n个元素,那么遍历时间复杂度就为...内部已重写equals()、hashCode()等方法,遵守了HashMap内部的规范(不清楚可以去上面看看putValue的过程),不容易出现Hash值计算错误的情况; 面试官:如果我想要让自己的...答:重写hashCode()equals()方法 重写hashCode()是因为需要计算存储数据的存储位置,需要注意不要试图从码计算中排除掉一个对象的关键部分来提高性能,这样虽然能更快但可能会导致更多的...Hash碰撞; 重写`equals()`方法,需要遵守自反性、对称性、传递性、一致性以及对于任何null的引用值x,x.equals(null)必须返回false的这几个特性,目的是为了保证key哈希表的唯一性

57330

Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系

通过码,可以提高检索的效率,主要用于存储结构快速确定对象的存储地址,如Hashtable、hashMap。 为什么说hashcode可以提高检索效率呢?...()方法获得该对象的哈希码,然后根据哈希找到相应的存储区域,最后取得该存储区域内的每个元素与该对象进行equals()比较,这样就不用遍历集合的所有元素就可以得到结论。...3、为什么重写equals()的同时要重写hashCode()方法将这个问题的答案之前,我们先了解一下将元素放入集合的流程,如下图: ?...这时候,即使我们重写equals()方法,也不会有特定的效果的,因为不能确保两个equals()结果为true的两个对象会被同一个存储区域,即 obj1.equals(obj2) 的结果为true...= other.y){ return false; } return true; } } 我们重写了父类ObjecthashCodeequals方法,看到hashCodeequals

2.1K10

如何编写出高质量的 equals hashcode 方法

hashcode 方法:用来获取码,码是由对象导出的一个整数值,码是没有规律的,如果 x y 是两个不同的对象,那么 x.hashCode() 与 y.hashCode() 基本上不会相同...equals hashcode 方法,所以系统判断的时候使用的是 Object 类默认的 equals hashcode 方法,默认的 equals 方法判断的是两个对象的引用地址是否相同,这里肯定是不一样的...2、重写 hashcode 方法equals 方法一样我们也使用 idea 编辑器帮我们生成的 hashcode 方法,只需要做稍微的改动就可以,具体 hashcode 代码如下: @Override...我们已经了解了怎么重写 equals 方法了,接下来就一起了解如何重写 hashcode 方法我们知道 hashcode 方法返回的是一个 int 类型的方法,那好办呀,下面这样重写就行了 @Override...结合 hashcode 的规范列表来看,要重写出一个高质量的 hashcode 方法,就需要尽可能保证每个元素产生不同的 hashcode 值, JDK ,每个引用类型都重写hashcode

82260

美团一面被问到Java基础,心里暗喜:你怎么敢的呀?

()的区别 1.30、你重写hashcode equals 么,为什么重写 equals 时必须重写 hashCode 方法?...如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就其它的地址。...:一旦发生了冲突,就会去寻找下一个空的地址,只要列表足够大,空的地址总能找到,并且记录存入 再哈希:又叫双哈希法,有多个不同的Hash函数,当发生冲突的时候,使用第二个,第三个,利用哈希函数计算地址...是绝对可靠的 (2)hashCode相等的两个对象他们的equals()不一定相等,也就是说hashCode不是绝对可靠的 1.30、你重写hashcode equals 么,为什么重写...equals 时必须重写 hashCode 方法? ​

26220

为什么重写equals必须重写hashCode

equals常见面试题 开始聊之前,我们先看几个常见的面试题,看看你能不能都回答上来。 1、equals==有什么区别? 2、hashcode相等的两个对象一定==相等equals相等?...3、两个对象用equals比较相等,那它们的hashcode相等? --- 如果我们重写equalshashcode,那么它使用的是Object方法的实现。...重写equals重写hashCode会存在什么问题 我们先看下面这段话 每个覆盖了equals方法的类,必须覆盖hashCode。...来自 Effective Java 第三版 结论:如果重写equals重写hashCode它与集合无法正常工作。 既然这样那我们就拿我们最熟悉的HashMap来进行演示推导吧。...,如果不重写将引起与集合(HashMap、HashSet、HashTable、ConcurrentHashMap)的冲突。

1.6K30

JavaBean,为什么要重写hashCode()方法equals()方法及如何重写

JavaBean为什么要重写hashCode()方法equals方法,我记得当时我巴拉巴拉半天就是没有说到重点....现在想一想归根到底还是我对这两个的理解不深刻,现在我特定来总结下.hashCode 方法用于集合的查找,equals 方法用于判断两个对象是否相等。...一、我们为什么需要重写hashCode()方法equals()方法?(Why) 有时我们的业务系统判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。...二、什么情况下需要重写hashCode()方法equals()方法?...(When) 当我们自定义的一个类,想要把它的实例保存在以Hash查找的集合时,我们就需要重写这两个方法; public class Student { private String name;

89430

Java集合容器面试题(2020最新版)

当两个不同的输入值,根据同一函数计算出相同的值的现象,我们就把它叫做碰撞(哈希碰撞)。 HashMap的数据结构 Java,保存数据有两种比较简单的数据结构:数组链表。...可以使用任何类作为 Map 的 key,然而在使用之前,需要考虑以下几点: 如果类重写equals() 方法,也应该重写 hashCode() 方法。...答:重写hashCode()equals()方法 重写hashCode()是因为需要计算存储数据的存储位置,需要注意不要试图从码计算中排除掉一个对象的关键部分来提高性能,这样虽然能更快但可能会导致更多的...Hash碰撞; 重写equals()方法,需要遵守自反性、对称性、传递性、一致性以及对于任何null的引用值x,x.equals(null)必须返回false的这几个特性,目的是为了保证key哈希表的唯一性...比如一个song对象的歌名歌手名分别采用一种排序方法的话,我们可以重写compareTo方法使用自制的Comparator方法或者以两个Comparator来实现歌名排序歌星名排序,第二种代表我们只能使用两个参数版的

1.2K20

为什么重写equals必须重写hashCode

1equals常见面试题 开始聊之前,我们先看几个常见的面试题,看看你能不能都回答上来。 1、equals==有什么区别? 2、hashcode相等的两个对象一定==相等equals相等?...3、两个对象用equals比较相等,那它们的hashcode相等? ---- 如果我们重写equalshashcode,那么它使用的是Object方法的实现。...3重写equals重写hashCode会存在什么问题 我们先看下面这段话 每个覆盖了equals方法的类,必须覆盖hashCode。...来自 Effective Java 第三版 结论:如果重写equals重写hashCode它与集合无法正常工作。 既然这样那我们就拿我们最熟悉的HashMap来进行演示推导吧。...---- 接下来我们打开hashCode的注释代码,看看执行结果 4总结 如果重写equals就必须重写hashCode,如果不重写将引起与集合(HashMap、HashSet、HashTable

1K20

第9条 覆盖equals时总要覆盖hashCode

第9条 覆盖equals时总要覆盖hashCode 覆盖了equals方法,也必须覆盖hashCode方法,if not,就违反了hashCode的通用约定,会导致无法跟基于集合正常运作....正如之前提到的,hashCode其实主要用于跟基于集合合作 如HashMap会把相同的hashCode的对象放在同一个桶(hash bucket),那么即使equals相同而hashCode...因为我们并没有重写hashcode,所以即使我们去get的时候传入的Student的name以及classname与put的时候的对象值是一样的,也即它们是equals的,但是要注意,它们的hashcode...是不一样的,这样就违反了上面所说的equals相等,hashCode也要相等的原则,所以当我们期望get到的是class1的时候,我们需要重写hashCode方法,让它们的hashcode相同!...步骤(a) 为该域计算int类型的码c: 返回result 测试,是否符合『相等的实例是否都具有相等的码』 OK,知道怎么写之后,我们重写Student类的hashCode方法: @Override

1.1K20

如何编写出高质量的 equals hashcode 方法

hashcode 方法:用来获取码,码是由对象导出的一个整数值,码是没有规律的,如果 x y 是两个不同的对象,那么 x.hashCode() 与 y.hashCode() 基本上不会相同...,我们没有重写 equals hashcode 方法,所以系统判断的时候使用的是 Object 类默认的 equals hashcode 方法,默认的 equals 方法判断的是两个对象的引用地址是否相同...2、重写 hashcode 方法equals 方法一样我们也使用 idea 编辑器帮我们生成的 hashcode 方法,只需要做稍微的改动就可以,具体 hashcode 代码如下: @Override...hashcode 方法返回的是一个 int 类型的方法,那好办呀,下面这样重写就行了 @Override public int hashCode() { return 1; } 这样写对...结合 hashcode 的规范列表来看,要重写出一个高质量的 hashcode 方法,就需要尽可能保证每个元素产生不同的 hashcode 值, JDK ,每个引用类型都重写hashcode

59750

2020最新总结大厂Java高频面试题(含答案解析)

代码如下: 同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下: 原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。...两个对象的 hashCode()相同,则 equals()也一定为 true,对? 不对,两个对象的 hashCode()相同,equals()不一定 true。...代码示例: ​ 执行的结果: 代码解读:很显然“通话”“重地”的 hashCode() 相同,然而 equals() 则为 false,因为列表hashCode()相等即两个键值对的哈希值相等...HashMap实际上是一个“链表”的数据结构,即数组链表的结合体。...当我们往Hashmapput元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组的位置(下标),如果该数组该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放

2.2K20

​第3章 对于所有对象都通用的方法

方法,也必须覆盖hashCode方法,if not,就违反了hashCode的通用约定,会导致无法跟基于集合正常运作....不重写hashCode带来的问题 正如之前提到的,hashCode其实主要用于跟基于集合合作 如HashMap会把相同的hashCode的对象放在同一个桶(hash bucket),那么即使...因为我们并没有重写hashcode,所以即使我们去get的时候传入的Student的name以及classname与put的时候的对象值是一样的,也即它们是equals的(我重写equals!)...,但是要注意,它们的hashcode是不一样的,这样就违反了上面所说的equals相等,hashCode也要相等的原则,所以当我们期望get到的是class1的时候,我们需要重写hashCode方法,让它们的...步骤(a) 为该域计算int类型的码c: 返回result 测试,是否符合『相等的实例是否都具有相等的码』 OK,知道怎么写之后,我们重写Student类的hashCode方法: @Override

50120
领券