Java:重写equals()和hashCode()

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.示例
下面的这个类遵循上面的设计原则,重写了类的equals()和hashCode()。
  1. package com.zj.unit;
  2. import java.util.Arrays;
  3.  
  4. public class Unit {
  5. private short ashort;
  6. private char achar;
  7. private byte abyte;
  8. private boolean abool;
  9. private long along;
  10. private float afloat;
  11. private double adouble;
  12. private Unit aObject;
  13. private int[] ints;
  14. private Unit[] units;
  15.  
  16. public boolean equals(Object o) {
  17. if (!(o instanceof Unit))
  18. return false;
  19. Unit unit = (Unit) o;
  20. return unit.ashort == ashort
  21. && unit.achar == achar
  22. && unit.abyte == abyte
  23. && unit.abool == abool
  24. && unit.along == along
  25. && Float.floatToIntBits(unit.afloat) == Float
  26. .floatToIntBits(afloat)
  27. && Double.doubleToLongBits(unit.adouble) == Double
  28. .doubleToLongBits(adouble)
  29. && unit.aObject.equals(aObject)
  30. && equalsInts(unit.ints)
  31. && equalsUnits(unit.units);
  32. }
  33.  
  34. private boolean equalsInts(int[] aints) {
  35. return Arrays.equals(ints, aints);
  36. }
  37.  
  38. private boolean equalsUnits(Unit[] aUnits) {
  39. return Arrays.equals(units, aUnits);
  40. }
  41.  
  42. public int hashCode() {
  43. int result = 17;
  44. result = 37 * result + (int) ashort;
  45. result = 37 * result + (int) achar;
  46. result = 37 * result + (int) abyte;
  47. result = 37 * result + (abool ? 0 : 1);
  48. result = 37 * result + (int) (along ^ (along >>> 32));
  49. result = 37 * result + Float.floatToIntBits(afloat);
  50. long tolong = Double.doubleToLongBits(adouble);
  51. result = 37 * result + (int) (tolong ^ (tolong >>> 32));
  52. result = 37 * result + aObject.hashCode();
  53. result = 37 * result + intsHashCode(ints);
  54. result = 37 * result + unitsHashCode(units);
  55. return result;
  56. }
  57.  
  58. private int intsHashCode(int[] aints) {
  59. int result = 17;
  60. for (int i = 0; i < aints.length; i++)
  61. result = 37 * result + aints[i];
  62. return result;
  63. }
  64.  
  65. private int unitsHashCode(Unit[] aUnits) {
  66. int result = 17;
  67. for (int i = 0; i < aUnits.length; i++)
  68. result = 37 * result + aUnits[i].hashCode();
  69. return result;
  70. }
  71. }

Java:重写equals()和hashCode()的更多相关文章

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

    1.何时需要重写equals() 当一个类有自己特有的 ”逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instanceof操作符检查 ”实参是否为正确的类型”. [2 ...

  2. java重写equals和hashCode方法

    一.重写equals方法 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等. 利用equals比较八大包装对象(如int,f ...

  3. Java 重写 equals 与 hashCode 的注意事项

    为什么重写 equals 的时候必须重写 hashCode 大家可能从很多教程中了解到: SUN官方的文档中规定"如果重定义equals方法,就必须重定义hashCode方法,以便用户可以将 ...

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

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

  5. Java 重写equals()与hashCode()方法

    List对象的contains方法实际上也是调用的equals()方法来进行逐条对比的. 示例代码: package com.imooc.collection; /** * 课程类 */ public ...

  6. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)

    Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例  原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...

  7. java中equals与hashCode的重写问题

    这几天有一个朋友问我在重写equals和hashCode上出现了问题,最后我帮她解决了问题,同时也整理出来分享给大家 现上Object的equals与HashCode的代码 public boolea ...

  8. Java中equals()和hashCode()的关系以及重写equals()和hashCode()的重要性

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6580647.html  一:关系 如果两个对象相等(equal),它们的hashcode一定相同: 如果两个对 ...

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

    一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); ...

随机推荐

  1. ios开发UI篇—UISlider

    概述 UISlider用于从连续范围的值中选择单个值的控件. 当您移动滑块的大拇指时,会将其更新后的值传递给附加的任何动作.滑块的外观是可配置的; 您可以对曲目和大拇指进行着色,并提供出现在滑块末端的 ...

  2. 自己动手写一个简易对象关系映射,ORM(单例版和数据库池版)

    准备知识 DBUtils模块  <<-----重点 DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式: DBUtils提供两种外部接口: Persist ...

  3. python实现用户登录问候

    创建一个至少包含 5个用户名的列表,且其中一个用户名为 'admin' .想象你要编写代码,在每位用户登录网站后都打印一条问候消息.遍历用户名列表,并向每位用户打印一条问候消息.添加一条 if 语句, ...

  4. jQuery|简单tab栏切换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Hammer.js 实现移动端元素的拖拽库

    1. Pan事件:在指定的dom区域内,一个手指放下并移动事件,即触屏中的拖动事件.这个事件在屏触开发中比较常用,如:左拖动.右拖动等,如手要上使用QQ时向右滑动出现功能菜单的效果.该事件还可以分别对 ...

  6. MongoDB基础教程

    MongoDB 一.下载MongoDB数据库 1.进入MongoDB官网进行下载,网址:https://www.mongodb.com/. 2.下载完成后可进行安装,安装后,并有了MongoDB服务. ...

  7. laravel when 的用法

    当你在使用where语句有前提条件时,比如某值为1的时候才执行where子句,否则不执行,这个时候,laravel5.5新出了一个简便方法when($arg,fun1[,fun2]). 具体用法如下: ...

  8. day1-exercise

    """ Day1 作业 Isabelle/刘佳赐 October 22, 2018 """ """ 1. 变量 ...

  9. python学习笔记(四):pandas基础

    pandas 基础 serise import pandas as pd from pandas import Series, DataFrame obj = Series([4, -7, 5, 3] ...

  10. 20155218 2016-2017-2 《Java程序设计》第9周学习总结

    20155218 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC全名Java DataBase Connectivity,是java联机数据库的标准 ...