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)));
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!