浅谈Java中的hashcode方法Java开发Java经验技巧.docVIP

浅谈Java中的hashcode方法Java开发Java经验技巧.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档