欢迎来到天天文库
浏览记录
ID:30776154
大小:76.96 KB
页数:8页
时间:2019-01-03
《java提高篇之hashcode-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java提高篇ZhashCodc-编程开发技术Java提高篇之hashCode原文出处:chenssy在询面三篇博文中LZ讲解了(HashMap>HashSet>HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最精华的部分,所以下而LZ揭开hashCode的“神秘”而纱。hashCode的作用要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也就是这个方法的作用。在讲解数组时(j3V3提高篇(十八)——数组),我们提到数组是java+效率最高的数据结构,但是“最高”
2、是冇前捉的。第一我们需要知道所查询数据的所在位置。第二:如果我们进行迭代查找时,数据量一定要小,对于大数据量而言一般推荐集合。在Java集合中有两类,一类是List,—类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?通过迭代来equals()是否相等。数据量小还可以接受,当我们的数据量大的时候效率可想而知(当然我们可以利用算法进行优化)。比如我们向HashSet插入1000数据,难道我们真的要迭代1000次,调用1000次e
3、quals()方法吗?hashCode提供了解决方案。怎么实现?我们先看hashCode的源码(Object)□publicnativeinthashCode();它是一个木地方法,它的实现与木地机器有关,这里我们暂且认为他返冋的是对象存储的物理位置(实际上不是,这里写是便于理解)。当我们向-•个集合屮添加某个元索,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,相同则不存,不同则散列到其他位置(具体情况请参考(Java提高篇(
4、)—-HashMap))。这样处理,当我们存入大量元素吋就可以大大减少调用equals()方法的次数,极大地提高了效率。所以hashCode在上面扮演的角色为寻域(寻找某个对象在集合中区域位置)。hashCode可以将集合分成若干个区域,每个对象都可以计算出他们的hash码,可以将hash码分组,每个分组对应着某个存储区域,根据一个对彖的hash码就可以确定该对彖所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率。hashCode对于一个对象的重要性hashCodc重要么?不重要,对于List集合、数组而言,他就是一个累赘,但是对于Hash
5、Map>HashSet>HashTable而言,它变得异常重要。所以在使用HashMap、HashSet>HashTable时一定要注意hashCode0对于一个对象而言,其hashCode过程就是-个简单的Hash算法的实现,其实现过程对你实现对象的存取过程起到非常重要的作用。在前而LZ提到了HashMap和HashTable两种数据结构,虽然他们存在若干个区别,但是他们的实现原理是相同的,这里我以HashTable为例阐述hashCode对于一个对象的重要性。一个对象势必会存在若干个属性,如何选择属性来进行散列考验着一个人的设计能力。如果我们将所
6、有属性进行散列,这必定会是一个糟糕的设计,因为对象的hashCode方法无时无刻不是在被调用,如果太多的屈性参与散列,那么需要的操作数时间将会大大增加,这将严重影响程序的性能。但是如果较少屈相参与散列,散列的多样性会削弱,会产生大量的散列“冲突”,除了不能够很好的利用空间外,在某种程度也会影响对象的查询效率。其实这两者是一个矛盾体,散列的多样性会带來性能的降低。那么如何对对象的hashCode进行设计,LZ也没有经验。从网上查到了这样一种解决方案:设置一个缓存标识来缓存当前的散列码,只冇当参与散列的对彖改变时才会重新计算,否则调用缓存的hashCod
7、e,这样就可以从很大程度上提高性能。在HashTable计算某个对象在tablet]数组中的索引位置,其代码如下:intindex=(hash&0x7FFFFFFF)%tab.length;为什么要&0x7FFFFFFF?因为某些对象的hashCode可能会为负值,与0x7FFFFFFF进行与运算可以确保index为一个正数。通过这步我可以直接定位某个对彖的位置,所以从理论上来说我们是完全可以利用hashCode直接定位对象的散列表屮的位置,但是为什么会存在一个key-value的键值对,利用key的hashCode來存入数据而不是直接存放value
8、呢?这就关系HashTable性能问题的最重耍的问题:Hash冲突!我们知道冲突的产生是由于不同的对象产生了
此文档下载收益归作者所有