hashtable与hashcode.docVIP

  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文档。上传文档
查看更多
hashtable与hashcode

为什么HashCode对于对象是如此的重要 一个对象的HashCode就是一个简单的Hash算法的实现,虽然它和那些真正的复杂的Hash算法相比还不能叫真正的算法,它如何实现它, 不仅仅是程序员的编程水平问题,而是关系到你的对象在存取是性能的非常重要的关系.有可能,不同的HashCode可能会使你的对象存取产生,成百上千倍 的性能差别。 我们先来看一下,在JAVA中两个重要的数据结构:HashMap和Hashtable,虽然它们有很大的区别,如继承关系不同,对的约束条件 是否允许null 不同,以及线程安全性等有着特定的区别,但从实现原理上来说,它们是一致的.所以,我们只以Hashtable来说明:V put K?key, V?value 将指定 key 映射到此哈希表中的指定 value。 V get Object?key 返回指定键所映射到的值,如果此映射不包含此键的映射,则返回 null. 更确切地讲,如果此映射包含满足 key.equals k 的从键 k 到值 v 的映射,则此方法返回 v;否则,返回 null。 ?boolean contains Object?value 测试此映射表中是否存在与指定值关联的键。 ?boolean containsKey Object?key 测试指定对象是否为此哈希表中的键。 ?boolean containsValue Object?value 如果此 Hashtable 将一个或多个键映射到此值,则返回 true。 V remove Object?key 从哈希表中移除该键及其相应的值。 int hashCode 按照 Map 接口的定义,返回此 Map 的哈希码值。 Enumeration elements 返回此哈希表中的值的枚举。 Enumeration keys 返回此哈希表中的键的枚举。   在java中,存取数据的性能,一般来说当然是首推数组,但是在数据量稍大的容器选择中,Hashtable将有比数组性能更高的查询速度.具体原因看下面的内容。   Hashtable在存储数据时,一般先将作为key的对象的HashCode和0x7FFFFFFF做与操作,因为一个对象的 HashCode可以为负数,这样操作后可以保证它为一个正整数.然后以Hashtable的长度取模,得到值对象在Hashtable中的索引。   index o.hashCode 0x7FFFFFFF %hs.length;这个值对象就会直接放在Hashtable的第index位置,对于写入,这和数组一样,把一个对象放在其 中的第index位置,但如果是查询,经过同样的算法,Hashtable可以直接通过key得到index,从第index取得这个值对象,而数组却要 做循环比较.所以对于数据量稍大时,Hashtable的查询比数据具有更高的性能。   虽然不同对象有不同的hashcode,但不同的hashCode经过与长度的取余,就很可能产生相同的index。   极端情况下会有大量的对象产生一个相同的索引.这就是关系Hashtable性能问题的最重要的问题:   Hash冲突。   常见的Hash冲突是不同key对象最终产生了相同的索引,而一种非常甚至绝对少见的Hash冲突是,如果一组对象的个数大过了int范围,而 HashCode的长度只能在int范围中,所以肯定要有同一组的元素有相同的HashCode,这样无论如何他们都会有相同的索引.当然这种极端的情况 是极少见的,可以暂不考虑,但是对于同的HashCode经过取模,则会产中相同的索引,或者不同的对象却具有相同的HashCode,当然具有相同的索 引。   事实上一个设计好的HashTable,一般来说会比较平均地分布每个元素,因为Hashtable的长度总是比实际元素的个数按一定比例进 行自增 装填因子一般为0.75 左右,这样大多数的索引位置只有一个对象,而很少的位置会有几个元素.所以Hashtable中的每个位置存放的是一个 链表,对于只有一个对象是位置,链表只有一个首节点 Entry ,Entry的next为null.然后有hashCode,key,属性保存了该位置 的对象的HashCode,key和 对象本身 ,如果有相同索引的对象进来则会进入链表的下一个节点.如果同一个索引中有多个对象,根据 HashCode和key可以在该链表中找到一个和查询的key相匹配的对象。   从上面我看可以看到,对于HashMap和Hashtable的存取性能有重大影响的首先是应该使该数据结构中的元素尽量大可能具有不同的 HashCode,虽然这并不能保证不同的HashCode产生不同的index,但相同的Hash

文档评论(0)

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

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

1亿VIP精品文档

相关文档