关于hashmap中hashcode的问题

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

MYYA

很有兴趣讨论一下这个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.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript