以下總結(jié)自effective java.
實(shí)現(xiàn)equals方法的過(guò)程如下:
1 使用==運(yùn)算符來(lái)判斷是否引用同一個(gè)對(duì)象。
2 使用instance of操作符來(lái)判斷參數(shù)是否是正確的類(lèi)型。
3 將實(shí)參cast成正確的類(lèi)型。
4 對(duì)于每個(gè)關(guān)鍵屬性,進(jìn)行比較:
對(duì)于非float或double的primitive類(lèi)型,使用==判斷等價(jià)性;
對(duì)于floa類(lèi)型,先使用Float.floatToIntBits轉(zhuǎn)換成int類(lèi)型,然后使用==比較int類(lèi)型的值;
對(duì)于double類(lèi)型,先使用Double.doubleToLongBits轉(zhuǎn)換成long類(lèi)型,然后使用==比較long類(lèi)型;
對(duì)于對(duì)象引用,遞歸的調(diào)用equals方法。
對(duì)于數(shù)組類(lèi)型,對(duì)其中的元素進(jìn)行上述的操作,或者使用Arrays.equals方法(version 1.5)。
為了避免NPE,可以使用
field == null ? o.field == null : fleld.equals(o.field);
重寫(xiě)hashCode方法如下:
1 把某個(gè)非零常數(shù)值,例如17,保存在int變量result中;
2 對(duì)于對(duì)象中每一個(gè)關(guān)鍵域f(指equals方法中考慮的每一個(gè)域),計(jì)算散列碼c:
2.1 boolean型,計(jì)算(f ? 0 : 1);
2.2 byte,char,short型,計(jì)算(int);
2.3 long型,計(jì)算(int) (f ^ (f>>>32));
2.4 float型,計(jì)算Float.floatToIntBits(f);
2.5 double型,計(jì)算Double.doubleToLongBits(f)得到一個(gè)long,再執(zhí)行[2.3];
2.6 對(duì)象引用,遞歸調(diào)用它的hashCode方法;
2.7 數(shù)組域,對(duì)其中每個(gè)元素按照上面的規(guī)則計(jì)算hash code。
3 將上面計(jì)算得到的散列碼保存到int變量c,然后執(zhí)行 result=37*result+c;
4 返回result。
實(shí)現(xiàn)equals方法的過(guò)程如下:
1 使用==運(yùn)算符來(lái)判斷是否引用同一個(gè)對(duì)象。
2 使用instance of操作符來(lái)判斷參數(shù)是否是正確的類(lèi)型。
3 將實(shí)參cast成正確的類(lèi)型。
4 對(duì)于每個(gè)關(guān)鍵屬性,進(jìn)行比較:
對(duì)于非float或double的primitive類(lèi)型,使用==判斷等價(jià)性;
對(duì)于floa類(lèi)型,先使用Float.floatToIntBits轉(zhuǎn)換成int類(lèi)型,然后使用==比較int類(lèi)型的值;
對(duì)于double類(lèi)型,先使用Double.doubleToLongBits轉(zhuǎn)換成long類(lèi)型,然后使用==比較long類(lèi)型;
對(duì)于對(duì)象引用,遞歸的調(diào)用equals方法。
對(duì)于數(shù)組類(lèi)型,對(duì)其中的元素進(jìn)行上述的操作,或者使用Arrays.equals方法(version 1.5)。
為了避免NPE,可以使用
field == null ? o.field == null : fleld.equals(o.field);
重寫(xiě)hashCode方法如下:
1 把某個(gè)非零常數(shù)值,例如17,保存在int變量result中;
2 對(duì)于對(duì)象中每一個(gè)關(guān)鍵域f(指equals方法中考慮的每一個(gè)域),計(jì)算散列碼c:
2.1 boolean型,計(jì)算(f ? 0 : 1);
2.2 byte,char,short型,計(jì)算(int);
2.3 long型,計(jì)算(int) (f ^ (f>>>32));
2.4 float型,計(jì)算Float.floatToIntBits(f);
2.5 double型,計(jì)算Double.doubleToLongBits(f)得到一個(gè)long,再執(zhí)行[2.3];
2.6 對(duì)象引用,遞歸調(diào)用它的hashCode方法;
2.7 數(shù)組域,對(duì)其中每個(gè)元素按照上面的規(guī)則計(jì)算hash code。
3 將上面計(jì)算得到的散列碼保存到int變量c,然后執(zhí)行 result=37*result+c;
4 返回result。