Java 覆盖equals时总要覆盖hashcode
Java覆盖equals时总要覆盖hashcode
最近学习java的基础知识,碰到Java覆盖equals时总要覆盖hashcode时候有许多疑问,经过和同事直接讨论及上网查询的资料,这里整理下,也好帮助大家理解,代码中有说明。
具体实现代码:
packagecn.xf.cp.ch02.item9; importjava.util.HashMap; importjava.util.Map; publicclassPhoneNumber { privatefinalshortareaCode; privatefinalshortprefix; privatefinalshortlineNumber; publicPhoneNumber(intareaCode,intprefix,intlineNumber) { rangeCheck(areaCode,999,"areacode"); rangeCheck(prefix,999,"prefix"); rangeCheck(lineNumber,9999,"linenumber"); this.areaCode=(short)areaCode; this.prefix=(short)prefix; this.lineNumber=(short)lineNumber; } privatestaticvoidrangeCheck(intarg,intmax,Stringname) { if(arg<0||arg>max) thrownewIllegalArgumentException(name+":"+arg); } @Override publicbooleanequals(Objecto) { if(o==this) returntrue; if(!(oinstanceofPhoneNumber)) returnfalse; PhoneNumberpn=(PhoneNumber)o; returnpn.lineNumber==lineNumber&&pn.prefix==prefix&&pn.areaCode==areaCode; } /* @Override //至于为什么使用31,这个是推荐值,研究表明这个数字用起来性能比较好 publicinthashCode() { intresult=17; result=31*result+areaCode; result=31*result+prefix; result=31*result+lineNumber; returnresult; } */ //如果一个对象不是经常变动,而且开销比较大的话,就要考虑吧散列码缓存在对象内部 //用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。 privatevolatileinthashcode; @Override publicinthashCode() { intresult=hashcode; if(result==0) { result=17; result=31*result+areaCode; result=31*result+prefix; result=31*result+lineNumber; hashcode=result; } returnresult; } publicstaticvoidmain(String[]args) { Map<PhoneNumber,String>m=newHashMap<PhoneNumber,String>(); m.put(newPhoneNumber(707,867,5309),"Jenny"); //这里不会返回jenny哦,会返回null,这个是因为put对象吧他们放到不同的散列桶中 System.out.println(m.get(newPhoneNumber(707,867,5309))); } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!