重写equals所要遵守的约定
1.自反性
对于任何非null的引用的值x;x.equals(x);必须返回的是true
2.对称性
对于任何非null的引用值x和y,当且仅当x.equals(y)为true的时候,y.equals(x)也必须返回true
3.传递性
对于任何非null的引用值想x,y,z,当且仅当x.equals(y);为true ;y.equals(z)的时候
x.eqauls(z)也必须为true
4.一致性
对于任何非null的引用值x和y,只要equals的比较操作在对象中的所有的信息都没有被修改,多次调用x.equals(y)就会一致的返回true;或者一致的返回false;
5,
最终要的一点是在重写equals的时候必须要重写hashcode
如果两个对象根据equals方法比较是相等的,那么调用这两个对象中任意一个对象的hashcode方法都必须产生同样的整数结果。如果调用eqauls方法去比较两个对象,如果两个对象是不相等的,则不一定产生不同的hashcode.
就有如下的例子
public final class PhoneNumber{
private final short areaCode;
private final short prefix;
private final short lineNumber;
public PhoneNumber(int areaCode,int prefix,int lineNumber){
this.areaCode=areaCode;
this.prefix=prefix;
this.lineNumber=lineNumber;
}
}
实例化 PhoneNumber t1=new PhoneNumber(2,3,4);
PhoneNumber t2=new PhoneNumber(2,3,4);
将ti作为key存储如下:
map.put(t1,"jack");
再用t2去取数据的时候,我们期望得到的数据为jack,但是实际我们得到的是null;这是为什么呢?
因为PhoneNumber 没有重写hashCode 方法,就两个相同的对象产生了不同的hashcode,而在get的时候我们根据t2所在散列桶中去找之前的数据,当然是找不到的,put的数据在t1,所在的散列桶中,所以用t2去找的时候当然为null;
因此在重写equals的时候必须重写hashcode方法。
转载于:https://blog.51cto.com/13919712/2284385
重写equals所要遵守的约定相关推荐
- Effective Java 对于所用对象都通用的方法 8.覆盖equals时请遵守通用约定.txt
对于eclipse覆盖equals方法就是Alt+Shift+S,而AS就是Alt+Insert.覆盖很简单,可是却容易导致错误,而且后果很严重.最容易避免的方法就是不覆盖,这样类就只与他自身相等. ...
- Java拾遗:001 - 重写 equals 和 hashCode 方法
2019独角兽企业重金招聘Python工程师标准>>> 重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被 ...
- java 重写equals方法的种种“坑”
重写java object类的equals方法 覆盖equals方法请遵守约定 什么情况下要覆盖equals方法 容易违反的对称性 不易察觉的传递性 覆盖equals请遵守通用约定 似乎覆盖equal ...
- 为什么重写equals方法时,要求必须重写hashCode方法?
1 equals方法 Object类中默认的实现方式是 : return this == obj .那就是说,只有this 和 obj引用同一个对象,才会返回true. 而我们往往需要用equ ...
- hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?
前言 大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗? 今天带大家来了解一下equal ...
- 重写equals方法的hashcode_Java equals 和 hashCode 的这几个问题可以说明白吗?
前言 上一篇文章 如何妙用Spring 数据绑定机制,灵魂追问 环节留下了一个有关 equals 和 hashcode 问题 .基础面试经常会碰到与之相关的问题,这不是一个复杂的问题,但很多朋友都苦于 ...
- hashcode相等的两个对象一定相等吗_为什么重写 equals方法时一定要重写hashCode方法?...
推荐阅读: 一线架构师总结SpringBoot,Cloud,Nginx与Docker,不信你搞不懂 47天洒热血复习,我终于"挤进"了字节跳动(附面经+学习笔记) 五年时间,从蘑菇 ...
- 重写equals就必须重写hashCode的原理分析
因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下. 如果不被重写(原生Object)的hashCode和equals是什么 ...
- 不同时重写equals和hashCode又会怎样?
作者:flyhero 微信公众号:码上实战(ID:Push-Code) 可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服 ...
最新文章
- html间隔代码_HTML+CSS基础入门开发,经典Loading加载缩放动画特效
- 时序数据库技术体系 – InfluxDB TSM存储引擎之数据写入
- java调用 restapi 乱码_Java HttpURLConnection模拟请求Rest接口解决中文乱码问题
- Qt工作笔记-使用toVariant().toMap()分割Json文件(666解析法)
- 小米10之后摩托罗拉Edge+也要用一亿像素相机,还有3.5耳机孔
- 启动ubuntu无反应_仅支持legacy bios 情况下 win10 安装 ubuntu 双系统踩的一坑
- python关于文件的一些记录
- current_session_context_class
- 校园火灾Focue-3---》音乐
- excel表格打印每页都有表头_分享|1分钟学会,让打印的表格每页自带标题行
- VC操作word绘制表格
- Linux新手入门之基础命令操作
- 七牛云 图片上传覆盖
- [MATLAB]b样条方程基函数方程的表达式, 及n阶基函数作图
- php随机分配班级座位,浅谈班级座位安排原则与方法
- 股票交易日(动态规划)----美团2016研发工程师编程题(二)
- python 人生的第一个小爬虫 爬小说 保存一下
- 大学计算机软件破解版,大学理工科学计算器
- strcmp与stricmp的认识
- 绿盟web应用防火墙(waf)导入证书提示无效
热门文章
- System.LazyT 延迟加载
- poj 1006 生理周期
- jQuery学习——表单
- 生成各种统计图的C#方法
- 操作系统原理第十章:文件系统
- 【Android WebSocket】Android 端 WebSocket 基本用法 ( 下载 Java-WebSocket源码 | 导入 Java-WebSocket-1.5.2 工程作为依赖 )
- 【Groovy】构建工具 ( 构建工具引入 | Gradle 构建工具作用 | 传统的依赖管理 )
- 【Android 逆向】Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 )
- 【Android 安全】DEX 加密 ( 多 DEX 加载 | 65535 方法数限制和 MultiDex 配置 | PathClassLoader 类加载源码分析 | DexPathList )
- 【Netty】反应器 Reactor 模式 ( 单反应器 Reactor 单线程 | 单反应器 Reactor 多线程 )