- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈Java中的hashcode方法Java开发Java经验技巧.doc
浅谈Java中的hashcodc方法-编程 开发技术
浅谈Java中的hashcode方法
原文出处:海子
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash 表來提高杳找效率。在J3V3的Object类中有一个方法:
public native int hashCode();
根据这个方法的声明可知,该方法返回一个int类型的数值,并且是木地方法, 因此在Object类屮并没有给出具体的实现。
为何Object类需要这样一个方法?它有什么作用呢?今天我们就來具体探讨一 F hashCode 方法。
一.hashCode方法的作用
对于包含容器类型的程序设计语言来说,基木上都会涉及到hashCodeo在Java 中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行, 这样的散列集合包括IlashSctx IlashMap以及IlashTablco
为什么这么说呢?考虑一种情况,当向集合屮插入对彖时,如何判别在集合屮是 否已经存在该对彖了?(注意:集合中不允许重复的元素存在)
也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。 但是如果集合中已经存在一力条数据或者更多的数据,如果采用equals方法去 逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当 集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode 值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的 hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再 进彳亍任何比较了;如果存在该hashcode值,就调用它的equals方法与新元素 进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲 突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一 点:Java中的hashCode方法就是根据一定的规则将与对象和关的信息(比如对 象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。下面 这段代码是java. util. IlashMap的中put方法的具体实现:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash 二 hash (key. hashCode ());
int i = indexFor (hash, table.length);
for (EntryK, V e = table[i]; e != null; e = e.next) {
Object k;
if (e. hash 二二 hash ((k 二 e. key)二二 key key. equals (k)))
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
modCount++;
addEntry(hash, key, value, i);
return null;
}
put方法是用來向HashMap中添加新的元素,从put方法的具体实现可知,会先 调用hashCode方法得到该元索的hashCode值,然后查看table中是否存在该 hashCode值,如果存在则调用equals方法重新确定是否存在该元素,如果存在, 则更新value值,否则将新的元素添加到HashMap屮。从这里可以看出,hashCode 方法的存在是为了减少equals方法的调用次数,从而提高程序效率。
如果对于hash表这个数据结构的朋友不清楚,可以参考这几篇博文;
http://www. /jiewei915/archive/2010/08/09/1796042. html
http://www. cnblogs. com/dolphin0520/archi ve/2012/09/28/2700000. html
http://www. java3z. com/cwbwebhome/artic1e/artic1e8/83560. html?id二4649 有些朋友谋以为默认情况F, hashCode返回的就是对象的存储地址,事实上这 种看法是不全而的,确实冇些JVM在实现时是直接返回对象的存储地址,但是大 多时候并不是这样,只能说可能存储地址有一定关联。下面是HotSpot JVM中生 成hash散列值的实现:
static inline intptr_t get_next_hash(Thread * Self, oop obj) {
intptr t val
您可能关注的文档
最近下载
- 03 八年级上册(下)-部编版初中语文文言文对比阅读(解析版).docx VIP
- 寿光模式课件.pptx
- (高清版)DG∕TJ 08-2038-2021 建筑围护结构节能现场检测技术标准.docx VIP
- 苏少版四年级上册音乐 2.2丰收之歌 打麦号子 课件(共21张PPT)(含音频+视频).ppt VIP
- Siemens西门子工业SINUMERIK Integrate Create MyHMI 3GL (安装) SINUMERIK Integrate Create MyHMI 3GL (安装)使用手册.pdf
- 产业园物业管理的重点和难点.docx VIP
- 大学竞选心理委员ppt模板.pptx VIP
- 2025年南京市中考语文试题卷(含答案解析).docx
- 药物疗法 口服给药法(基础护理课件).pptx
- 2025年京东常温奶行业白皮书doc.docx VIP
文档评论(0)