第九條:覆蓋equals時總要覆蓋hashCode

文章40頁有錯誤,m.get(new PhoneNumber(408,867,5309))應該改為m.get(new PhoneNumber(707,867,5309)),與文章上面的HashMap例子一致,對于文章中的代碼,我自己手敲整理了下。

首先是PhoneNumber類,如下代碼

public classPhoneNumber {

private shortareaCode;

private shortprefix;

private shortlineNumber;

publicPhoneNumber(intareaCode, intprefix, intlineNumber){

rangeCheck(areaCode,999,"area code");

rangeCheck(prefix,999,"prefix");

rangeCheck(lineNumber,9999,"line number");

this.areaCode= (short)areaCode;

this.prefix= (short)prefix;

this.lineNumber= (short)lineNumber;

}

private static voidrangeCheck(intarg, intmax,String name){

if(arg <0|| arg > max){

throw newIllegalArgumentException(name +":"+ arg);

}

}

@Override

public booleanequals(Object o) {

if(o ==this){

return true;

}

if(!(oinstanceofPhoneNumber)){

return false;

}

PhoneNumber pn = (PhoneNumber)o;

returnpn.lineNumber==lineNumber&& pn.prefix==prefix&& pn.areaCode==areaCode;

}

private volatile inthashCode;// 輕量級線程安全

@Override

public inthashCode() {

intresult =hashCode;

if(result ==0){

result =17;// 可以任意不等于0的值

intprimeNumber =31;// 奇素數(shù)

result = primeNumber * result +areaCode;

result = primeNumber * result +prefix;

result = primeNumber * result +lineNumber;

hashCode= result;

}

returnresult;

}

@Override

publicStringtoString() {

returnString.format("(%03d) %03d-%04d",areaCode,prefix,lineNumber);

}

}

調(diào)用如上代碼,如下

Map<PhoneNumber,String> m =newHashMap<PhoneNumber,String>();

m.put(newPhoneNumber(707,867,5309),"Jenny");// 存儲到map中

m.get(newPhoneNumber(707,867,5309));// 從map中取出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容