覆盖equals时,遵守通用约定
对equal方法的覆盖看起来很简单,但是有许多情况是容易导致错误,最好的避免这些错误的办法
就是不覆盖equals方法.
必须遵循的原则:
自反性--对于任何非空的引用 x,有x.equals(x) 为true;
对称性--对于任何非空的引用x,y,如果x.equals(y) 为true,则必有y.equals(x) 为true;
传递性--对于任何非空的引用x,y,z,如果x.equals(y) 为true且y.equals(z) 为true,
则必有x.equals(z) 为true;
一致性--对于任何非空的引用x,y,只要equals的比较操作在对象中所用信息没被修改,
多次调用x.equals(y)会一致为TRUE或者一致为FALSE。
对于任何非空x,x.equals(null) 为FALSE。
实现高质量的equals方法的诀窍:
1、使用==操作符检查是否为这个对象的引用。
2、使用instanceof检查参数类型。
在继承类或者接口调用时候,为了防止强制转换错误,经常会先用instanceof判断类型参数
3、把参数转换成正确的类型。因为前面作了instanceof测试,所以强制转换不会错误
4、对于该类中的关键域 ,检查参数中的域与该对象中对于域是否匹配。

覆盖equals时总是要覆盖hashCode
只要对象的equals方法比较操作所用到的信息没被修改,那么对这个对象调用多次,hashCode
方法必须始终返回同一个整数。
如果两个对象根据equals方法比较是相等的,那么调用这两个对象调用hashCode必须是同一个值
如果两个对象的equals方法比较不相等,那么调用这两个对象hashCode不一定产生不同的整数。
相等的对象必须具有相等的散列码
public final class Phone{

   .....
    
    @Override 
    public boolean equals(Object  o){
        ....
    }
}
假设你企图将这个类与hashMap一起使用:
Map<Phnoe,String> map= new HashMap<Phnoe,String>();
    map.put(new Phone(),"lily");
这时候,你可能期望map.get(new Phone())会返回一个 “lily”,但是实际返回为null
注意:这里涉及两个Phone实例,第一个被插入到map集合中,第二个实例和第一个相等,被用于获取
,由于Phone类没有覆盖hashCode方法,从而导致两个相等的实例具有不同的散列码,违反了hashCode方法
约定。即put把一个Phone放入一个散列筒,但是get从另一个散列筒中拿取,所以为null;
即便是正好从一个散列筒中操作,也会因为Hashmap'的优化,可以缓存相关联的的散列码。这样get得到的也是null。

【代码优化】equals深入理解相关推荐

  1. C# == equals 本质理解

    C# == equals 本质理解 using System; using System.Diagnostics; using System.Text; using System.Collection ...

  2. equals()的理解

    equals()的理解 equals()比较的是同一个类型的两个不同对象里的属性们是否都相等,相等返回true,否则返回false. API中某些常用的类(如String.Date.File.包装类等 ...

  3. java中equals的理解(1)

    在Java字符串那些事儿一文发表后,朋友给我留言说:比较字符串用equals不就完了呗,干嘛要用"==",吃饱了撑的,能不能来点实际的.其实在文章里我是想表明,Java字符串两种声 ...

  4. 【Java】浅析equals()和hashCode()

    总览equals( ) 方法 理解equals()方法和==运算符的区别是非常重要的. 默认情况下(即没有被重写时)equals()只能比较引用类型,"=="既能 比较引用类型又能 ...

  5. java 夯实基础_夯实基础-java equals使用,和 == 的区别

    在研究hashcode的用法,发现自己对equals的理解还不够深,废话少说,继续专研,记录如下: 要想搞清楚equals和==的区别,就先要搞清楚JAVA的数据类型: java的数据类型只要分两大类 ...

  6. 我理解的Java栈与堆,String类

    无意间在CSDN上看到一篇说栈与堆的文章,欣然取之,后来发现里面有些东西确实还有待推敲. 再看看评论,看到了高手的详解.我整合了一下,加上自己的理解,现在贴上来,希望多多赐教. 1. 栈(stack) ...

  7. Lombok的@Data注解自动重写equals

    我所遇到的问题: 当我看到Lombok的@EqualsAndHashCode注解可以重写equals和hashcode时,就像自己操作一下. 然后... package domain;import l ...

  8. StringUtils.isBlank,equals与==的判断参数分析

    StringUtils之isBlank分析 StringUtils之equals分析 String.equals报java.lang.NullPointerException 本篇为总结篇,看不懂结合 ...

  9. Java常用类(Object类及它的常用方法)

    常见对象(API概述以及Object类的概述) API(Application Programming Interface) 应用程序编程接口 Java API 就是Java提供给我们使用的类,这些类 ...

  10. 面试干货——年底干货大放送,你准备好了吗?

    前言:年底了,骚年们有没有很鸡冻--年终奖有盼头了.之前在介绍事件的这篇 C#基础系列--再也不用担心面试官问我"事件"了 也聊到了面试,引起了很多园友的共鸣.在不久的年后,热门的 ...

最新文章

  1. springboot 集成jpa_基于Spring Boot+JPA Restful 风格的数据
  2. win计算机管理没有权限,Windows 7提示没有管理员权限怎么办
  3. 绝对炫的3D幻灯片-SLICEBOX
  4. 皮一皮:中国男足啊..这球少一个人帮忙这球都进不了...
  5. 微软发布的python教程_微软发布Python 教程《Develop with Python on Windows》
  6. 第五六周机电传动控制作业
  7. 后端DTO(数据传输对象)与DAO(数据库数据源对象)解耦的好处
  8. java 界面输出控制台信息,java 怎么获取控制台的数据并且输出到GUI上
  9. C#笔记06 面向对象和类
  10. 中国移动创新系列丛书《OPhone应用开发权威指南》读者交流活动
  11. myeclipse java设置_【使用指南】MyEclipse部署配置(多图)
  12. hadoop启动_hadoop服务快速部署
  13. 三菱FX3U,三轴搬运PLC程序,控制三个台达B2伺服,信捷触摸屏的程序,有电气CAD图纸
  14. php截取字符串右边,如何从右边向左截取字符串
  15. C1驾考 科目二 (超详细!文字+实拍图)
  16. 蓝牙耳机连接笔记本声音卡顿解决办法
  17. 开瑞k50和k50s 导航傻瓜升级方法,其他车载导航也可以参考。
  18. 破解路由器管理登录密码
  19. 十日均线算法oracle,十日均线买卖法则,简单管用!
  20. ipsec 加密流程(一):ipsec策略匹配

热门文章

  1. HDU - 1247 (字典树水题)
  2. 360 绑架浏览器首页的解决方法
  3. 如何使用3klCon实现大规模自动化网络侦察
  4. myeclipse安装maven
  5. Android studio 报错Failed to open zip file解决方法
  6. java中json进阶_JSON学习
  7. 谈谈tmpdir与innodb_tmpdir的区别和用处
  8. 关于ES6 Class语法相关总结
  9. 设计模式 单例模式 使用模板及智能指针
  10. 《Android权威编程指南(The Big Nerd Ranch Guide)(第二版)》12.4挑战练习