1.何时需要重写equals()

当一个类有自己特有的 ”逻辑相等”概念(不同于对象身份的概念)。
2.设计equals()
[1]使用instanceof操作符检查 ”实参是否为正确的类型”。
[2]对于类中的每一个 ”关键域”,检查实参中的域与当前对象中对应的域值。
[2.1]对于非float和double类型的原语类型域,使用==比较;
[2.2]对于对象引用域,递归调用equals方法;
[2.3]对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较;
[2.4]对于double域,使用Double.doubleToLongBits(adouble) 转换为int,再使用==比较;
[2.5]对于数组域,调用Arrays.equals方法。
3.当改写equals()的时候,总是要改写hashCode()
根据一个类的equals方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode方法,它们仅仅是两个对象。因此,违反了 ”相等的对象必须具有相等的散列码”。
4.设计hashCode()
[1]把某个非零常数值,例如17,保存在int变量result中;
[2]对于对象中每一个关键域f(指equals方法中考虑的每一个域):
[2.1]boolean型,计算(f ? 0 : 1);
[2.2]byte,char,short型,计算(int);
[2.3]long型,计算(int) (f ^ (f>>>32));
[2.4]float型,计算Float.floatToIntBits(afloat);
[2.5]double型,计算Double.doubleToLongBits(adouble)得到一个long,再执行[2.3];
[2.6]对象引用,递归调用它的hashCode方法;
[2.7]数组域,对其中每个元素调用它的hashCode方法。
[3]将上面计算得到的散列码保存到int变量c,然后执行 result=37*result+c;
[4]返回result。
5.示例
import java.util.Arrays;/*** 类描述:set集合针对String 类型和8大基础数据类型过滤掉重复数据,* * 如果存放的是其他类型对象,则需要重写hashCode方法和equals方法,当equals 比较相等时,则会去比较hashCode值* * hashCode的值 如果一致的话,则不会存进set*/
public class Unit {private short ashort;private char achar;private byte abyte;private boolean abool;private long along;private float afloat;private double adouble;private Unit aObject;private int[] ints;private Unit[] units;public boolean equals(Object o) {if (o == null || !(o instanceof Unit))return false;Unit unit = (Unit) o;return unit.ashort == ashort&& unit.achar == achar&& unit.abyte == abyte&& unit.abool == abool&& unit.along == along&& Float.floatToIntBits(unit.afloat) == Float.floatToIntBits(afloat)&& Double.doubleToLongBits(unit.adouble) == Double.doubleToLongBits(adouble)&& unit.aObject.equals(aObject)&& Arrays.equals(ints, unit.ints)&& Arrays.equals(units, unit.units);}public int hashCode() {final int prime = 37;int result = 17;result = prime * result + (int) ashort;result = prime * result + (int) achar;result = prime * result + (int) abyte;result = prime * result + (abool ? 0 : 1);result = prime * result + (int) (along ^ (along >>> 32));result = prime * result + Float.floatToIntBits(afloat);long tolong = Double.doubleToLongBits(adouble);result = prime * result + (int) (tolong ^ (tolong >>> 32));result = prime * result + aObject.hashCode();result = prime * result + intsHashCode(ints);result = prime * result + unitsHashCode(units);return result;}private int intsHashCode(int[] aints) {int result = 17;for (int i = 0; i < aints.length; i++)result = 37 * result + aints[i];return result;}private int unitsHashCode(Unit[] aUnits) {int result = 17;for (int i = 0; i < aUnits.length; i++)result = 37 * result + aUnits[i].hashCode();return result;}
}

转载于:https://www.cnblogs.com/kofxxf/p/4218501.html

Java重写equals()和hashCode()相关推荐

  1. Java:重写equals()和hashCode()

    http://blog.csdn.net/ansel13/article/details/5437486 很基础的东西就是由于没上心,三番五次地出错,这次好好总结下吧. 众所周之,String .Ma ...

  2. Java:重写equals()和hashCode() 1

    來源: 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473 ...

  3. hashCode之二--Java:重写equals()和hashCode()

    以下内容总结自<Effective Java>. 1.何时需要重写equals() 当一个类有自己特有的"逻辑相等"概念(不同于对象身份的概念). 2.设计equals ...

  4. Java重写equals和hashCode方法

    在日常程序中,我们习惯使用equals方法来比较两个对象,继承自Object的equals方法默认的比较两个对象的内存地址(String类重写了equals方法,比较字符串的内容).假如我们创建了两个 ...

  5. 在Java里重写equals和hashCode要注意什么问题

    问题:在Java里重写equals和hashCode要注意什么问题 重写equals和hashCode有哪些问题或者陷阱需要注意? 回答一 理论(对于语言律师或比较倾向于数学的人): equals() ...

  6. Java实战equals()与hashCode()

    2019独角兽企业重金招聘Python工程师标准>>> 一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equal ...

  7. 不同时重写equals和hashCode又会怎样?

    作者:flyhero 微信公众号:码上实战(ID:Push-Code) 可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服 ...

  8. 为什么使用HashMap需要重写hashcode和equals方法_不同时重写equals和hashCode又会怎样?听听过来人的经验...

    可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服,这么多约定竟然都能记得,但我不知道你是不是真的理解呢. 一.我不同时重 ...

  9. 运用简单的超市购物车系统,理解重写equals、hashcode的意义

    更多干货见博主个人网站:https://blog.zhenglin.work 运用简单的超市购物车系统,理解重写equals.hashcode的意义,以及map的学习 商品类: 先编写一个商品类,要有 ...

最新文章

  1. IBM会话设置和覆盖规则
  2. 唐筛的准确率这么低为什么还要做_【NT 唐筛 四维】 【唐筛结果通知】...
  3. 大型电商网站的页面静态化方案是如何支撑亿级流量的?
  4. Redis(四):Spring + JedisCluster操作Redis(集群)
  5. jQuery 学习笔记之十二 (选项卡)
  6. [PYTHON] 深度解析copy.copy() 与 copy.deepcopy()
  7. Q96:PT(1):方格纹理(Checker)(2)——2D Checker
  8. React:网络工具库
  9. 用keil5将程序下载到板子里
  10. knx智能照明控制系统电路图_智能照明控制系统KNX
  11. 事业单位计算机技术岗工资,事业技术工资待遇
  12. Java代码混淆技术选型
  13. matlab命令窗口汉字显示为乱码 添加绝对路径
  14. 解决office 2019打开word、excel慢的问题
  15. MBTI职业性格在软件研发组织中不同岗位的分布研究
  16. python批量打印pdf_通过Dynamo批量打印PDF图纸
  17. 启动手机自带浏览器和手机拨号
  18. 如果让你只推荐一本nbsp;Javaamp;nbs…
  19. C# 绘制验证码图片
  20. 用原生JS写一个网页版的2048小游戏(兼容移动端)

热门文章

  1. s3c2410下利用TL16C554扩展4个全功能串口
  2. 数据库历险记(二) | Redis 和 Mecached 到底哪个好?
  3. Db4o结合Linq、Lambda表达式的简单示例
  4. 慕课网_《微信授权登录》学习总结
  5. 详解SQL中的触发器
  6. java 类型转换的原理
  7. Oracle手工建库
  8. 线性O(N)时间复杂度求素数 , 筛法
  9. ADSL防御******的十大方法
  10. 谈谈垃圾回收机制方式及内存管理