为了账号安全,请及时绑定邮箱和手机立即绑定

关于hashmap中hashcode的问题

关于hashmap中hashcode的问题

月关宝盒 2019-04-08 11:18:28
http://blog.sina.com.cn/s/blog_7d17f3cc01014dva.html文章中说道一句话,“在使用自定义对象做key的时候,一定要去实现hashcode方法,不然hashmap就成了纯粹的链表,查找性能非常的慢,添加节点元素也非常的慢”我非常不理解,主要不理解这个hashcode是怎么算的呢,如果根据对象地址来算的话,也不会出现上面说的问题
查看完整描述

2 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

很有兴趣讨论一下这个hashcode().
javaapi里的Object.hashcode():
(Thisistypicallyimplementedbyconvertingtheinternaladdressoftheobjectintoaninteger,butthisimplementationtechniqueisnotrequiredbytheJavaprogramminglanguage.)
看代码可以知道,hashcode()是一个native函数,但实际JVM会不会直接用对象地址来做hashcode有待探讨,因为现代的JVM堆都是分代管理的,一个Object很可能在一次GC后改变其对象地址.而对一个对象来说, 其生命周期内的hashcode是不会变的.
EffectiveJava里提到自定义hashcode()的recipe(实际上在Eclipse里,右键->Source->GeneratehashcodeandEquals可以代劳).大概例子这样:
privateStrings;
privateinta;
privateshortb;
privateDated;
@Override
publicinthashCode(){
finalintprime=31;
intresult=1;
result=prime*result+a;
result=prime*result+b;
result=prime*result+((d==null)?0:d.hashCode());
result=prime*result+((s==null)?0:s.hashCode());
returnresult;
}
JVM中Object.hashCode()实现
Insummary,thenotionthatObject.hashCode()isbasedontheobject's
addressislargelyahistoricartefactthathasbeenobsoletedbythe
propertiesofmoderngarbagecollectors.
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 380 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信