覆写hashCode equal方法
1.为什么要重写hashCode方法?
当自己要新建一个class,并要把这个类放到HashMap的时候,需要覆写这两个办法。如果不覆写,放入两个新的对象,可能会是不相等的。
在java的集合中,判断两个对象是否相等的规则是:
- 首先,判断两个对象的hashCode是否相等
- 如果不相等,认为两个对象也不相等
- 如果相等,则判断两个对象用equals运算是否相等
- 如果不相等,认为两个对象也不相等
- 如果相等,认为两个对象相等
2.核心注意
- equals()相等的两个对象,hashcode()一定相等;
- equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
3.Override
假设class有下面3个成员变量:
- private Object property1;
- private Object property2;
- private Object property3;
```java
@Override
public int hashCode() {
int result = 17;
result = result * 37 + property1.hashcode;
result = result * 37 + property2.hashcode;
result = result * 37 + property3.hashcode;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (obj instanceof Point) {
Point p = (Point) obj;
if (this.x == p.x && this.y == p.y)
return true;
}
return false;
}
```
想更好的实现还可以使用
Apache Commons Lang
包来重写hashCode()
和equals()
方法。
4.为什么还要设计hashcode()方法,一个equals()不就足够了吗?
只要一个equals()方法肯定可以保证代码的执行,但是这样做却忽略了一个重要指标–——效率。
- hashcode()的存在可以大大地提升效率。试想,如果仅使用equals()方法,在往一个HashSet中添加元素的时候,需要将这个元素与HashSet中的每个元素进行euqals()比较,时间为O(N),
- 而如果使用hashcode()方法,根据该元素的hashcode值,可以直接定位到它的位置,
- 如果该位置没有元素,则直接插入(equals()肯定不相等),否则,再使用equals()对比,相等则丢弃,不必插入,不相等则可以使用其他方法(如向后移动一位等),时间复杂度降至O(1)。
想想HashMap的get()
方法是如何工作的。
因此,重写equals()方法总是要重写hashcode(),请务必遵守。
覆写hashCode equal方法的更多相关文章
- [改善Java代码]覆写equals方法必须覆写hashCode方法
覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先 ...
- java覆写hashcode方法
覆写hashcode 1. 把某个非零常数值,例如17,保存在int变量result中: 2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域): 3, boolean型,计算(f? 0 ...
- 为什么覆写equals()方法的时候总是要覆写hashcode()?
要回答这个问题,我们应该先认识一下obj中的equals和hascode方法 1.equals()方法在obj中定义如下: public boolean equals(Object obj) { re ...
- 覆写equals方法为什么需要覆写hashCode方法
覆写equals方法必须覆写hashCode方法,是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢? void test() { // Person类的实例作为Map的k ...
- 使用第三方工具覆写Object中方法
我们在实际开发中,经常需要覆写Object中的equals,hashcode,toString方法,其实编写这些代码并不是很难,但很枯燥和乏味. 下面推荐Google的Guava jar包来覆写上面的 ...
- 为什么覆写equals必须要覆写hashCode?
============================================= 原文链接: 为什么覆写equals必须要覆写hashCode? 转载请注明出处! ============= ...
- (强制)要求覆写equals必须覆写hashCode(原理分析)
hashCode和equals hashCode和equals用来标识对象,两个方法协同工作可用来判断两个对象是否相等.众所周知,根据生成的哈希将数据散列开来,可以使存取元素更快.对象通过调用Obje ...
- [改善Java代码]覆写变长方法也循规蹈矩
建议6:覆写变长方法也循规蹈矩 在Java中,子类覆写父类中的方法很常见,这样做既可以修正Bug也可以提供扩展的业务功能支持,同时还符合开闭原则(Open-Closed Principle),我们来看 ...
- hashcode(),equal()方法深入解析
首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...
随机推荐
- iOS开发——WAVE音频文件解析
WAV文件也分了好几类,相应的非数据信息存储在文件的头部,下面简单的提一下,然后在最后重点介绍44字节的那种,一般用的都是这个. 1.8KHz采样.16比特量化的线性PCM语音信号的WAVE文件头格式 ...
- iOS动画特效
关于图层的几个坐标系. 对于ios来说,坐标系的(0,0)点在左上角,就是越往下,Y值越大.越往右,X值越大. 一个图层的frame,它是position,bounds,anchorPoint和tra ...
- 远程开户系统开放API接口
如今随着智能识别技术的成熟和商用,金融领域也开始逐渐试水"远程开户".从OCR身份证识别到人脸识别,到如今市场上即将出现完整的远程开户系统,除了需要成熟的技术做支撑外,还需要对市场 ...
- SQL SERVER 2000 数据恢复(分离数据库+附加数据库)
一.分离数据库 SQL Server 2000允许分离数据库的数据和事务日志文件,然后将其重新附加到同一台或另一台服务器上.分离数据库将从SQL Server 删除数据库,所以当点击“分离数据 ...
- bzoj1449————2016——3——14
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1449 题目简述: Description Input Output 一个整数表示联盟里所有球 ...
- 转化成maven dependencis
右键工程--->configure--->convert to maven project
- ZOJ 1025 Wooden Sticks
题目大意:有n个木棍,分别具有长度li和重量wi.对于木棍s1和s2,若l1<=l2且w1<=w2,则s1.s2可构成单调递增序列.求n个木棍中这样序列的个数. 最先的想法是,先排序,然后 ...
- java_web学习(2)Servlet
软件编程体系 B\S 系统架构与C\S 系统结构 Web服务器 HTTP 协议:Web 浏览器与 web 服务器的交互所遵循的规则. Web 服务器:Web服务器可以解 ...
- iOS 之 自动释放池
向一个对象发送autorelease消息时,cocoa会将该对象的一个引用放入最新的自动释放池.作用域结束时,自动释放池会被释放,池中所有的对象也就被释放了.
- 一点养老APP模式定制系统平台源码
一点养老APP模式定制系统开发:136.1013.1824电/微:搭建一点养老APP模式定制系统平台.专注于为企业和商家客户提供基于腾讯微信公众平台系统程序和APP等开发服务,中国养老金融50人论坛2 ...