A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© songynnm 中级黑马   /  2015-8-15 10:54  /  529 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

何时需要重写equals()
当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。

如何覆写equals()和hashcode

覆写equals方法
1  使用instanceof操作符检查“实参是否为正确的类型”。
2  对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。
3. 对于非float和double类型的原语类型域,使用==比较;
4  对于对象引用域,递归调用equals方法;
5  对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较;
6  对于double域,使用Double.doubleToLongBits(adouble)转换为int,再使用==比较;
7  对于数组域,调用Arrays.equals方法。
覆写hashcode
1. 把某个非零常数值,例如17,保存在int变量result中;
2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域):
3, boolean型,计算(f? 0 : 1);
4. byte,char,short型,计算(int);
5. long型,计算(int)(f ^ (f>>>32));
6. float型,计算Float.floatToIntBits(afloat);
7. double型,计算Double.doubleToLongBits(adouble)得到一个long,再执行[2.3];
8. 对象引用,递归调用它的hashCode方法;
9. 数组域,对其中每个元素调用它的hashCode方法。
10. 将上面计算得到的散列码保存到int变量c,然后执行result=37*result+c;
11. 返回result。

举个例子:
  1. [java] view plaincopy
  2. public class MyUnit{  
  3.     private short ashort;  
  4.     private char achar;  
  5.     private byte abyte;  
  6.     private boolean abool;  
  7.     private long along;  
  8.     private float afloat;  
  9.     private double adouble;  
  10.     private Unit aObject;  
  11.     private int[] ints;  
  12.     private Unit[] units;  
  13.    
  14.     public boolean equals(Object o) {  
  15.        if (!(o instanceof MyUnit))  
  16.            return false;  
  17.        MyUnit unit = (MyUnit) o;  
  18.        return unit.ashort == ashort  
  19.               && unit.achar == achar  
  20.               && unit.abyte == abyte  
  21.               && unit.abool == abool  
  22.               && unit.along == along  
  23.               && Float.floatToIntBits(unit.afloat) == Float  
  24.                      .floatToIntBits(afloat)  
  25.               && Double.doubleToLongBits(unit.adouble) == Double  
  26.                      .doubleToLongBits(adouble)  
  27.               && unit.aObject.equals(aObject)   
  28.               && equalsInts(unit.ints)  
  29.               && equalsUnits(unit.units);  
  30.     }  
  31.    
  32.     private boolean equalsInts(int[] aints) {  
  33.        return Arrays.equals(ints, aints);  
  34.     }  
  35.    
  36.     private boolean equalsUnits(Unit[] aUnits) {  
  37.        return Arrays.equals(units, aUnits);  
  38.     }  
  39.    
  40.     public int hashCode() {  
  41.        int result = 17;  
  42.        result = 31 * result + (int) ashort;  
  43.        result = 31 * result + (int) achar;  
  44.        result = 31 * result + (int) abyte;  
  45.        result = 31 * result + (abool ? 0 : 1);  
  46.        result = 31 * result + (int) (along ^ (along >>> 32));  
  47.        result = 31 * result + Float.floatToIntBits(afloat);  
  48.        long tolong = Double.doubleToLongBits(adouble);  
  49.        result = 31 * result + (int) (tolong ^ (tolong >>> 32));  
  50.        result = 31 * result + aObject.hashCode();  
  51.        result = 31 * result + intsHashCode(ints);  
  52.        result = 31 * result + unitsHashCode(units);  
  53.        return result;  
  54.     }  
  55.    
  56.     private int intsHashCode(int[] aints) {  
  57.        int result = 17;  
  58.        for (int i = 0; i < aints.length; i++)  
  59.            result = 31 * result + aints[i];  
  60.        return result;  
  61.     }  
  62.    
  63.     private int unitsHashCode(Unit[] aUnits) {  
  64.        int result = 17;  
  65.        for (int i = 0; i < aUnits.length; i++)  
  66.            result = 31 * result + aUnits[i].hashCode();  
  67.        return result;  
  68.     }  
  69. }  
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马