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;@OverridepublicinthashCode(){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'saddressislargelyahistoricartefactthathasbeenobsoletedbythepropertiesofmoderngarbagecollectors.
添加回答
举报
0/150
提交
取消