WEB开发网
开发学院软件开发Java JAVA HASHMAP的原理分析 阅读

JAVA HASHMAP的原理分析

 2009-12-29 00:00:00 来源:WEB开发网   
核心提示: 先介绍一下负载因子(loadFactor)和容量(capacity)的属性,其实一个 HashMap 的实际容量就因子*容量,JAVA HASHMAP的原理分析(2),其默认值是 16(DEFAULT_INITIAL_CAPACITY)×0.75=12;这个很重要,当存入HashMa

先介绍一下负载因子(loadFactor)和容量(capacity)的属性。其实一个 HashMap 的实际容量就因子*容量,其默认值是 16(DEFAULT_INITIAL_CAPACITY)×0.75=12;这个很重要,当存入HashMap的对象超过这个容量时,HashMap 就会重新构造存取表.

最重要的莫过于Put与Get方法.

我们先看put. 这里先说一下,HashMap的hash函数是对key对像的hashCode进行hash,并把Null keys always map to hash 0.这里也正好证明了为什么基本类型(int之类) 不能做KEY值。

参考put方法源码,首选判断Key是否为null,若为NULL,刚从0号散列桶内去寻找key为null的Entry,找到则用新的Value替换旧的 Value值,并返回旧值.反之把当前Entry放入0号桶,0号桶内的其他Entry链接到当前Entry后面(参考Entry的next属性).

如果是非NULL值,其实已经很简单,根把hash结果找到相应的hash桶(当前桶),遍历桶内链表,如果找到与当前KEY值相同Entry, 则替抱该Entry的value值为当前value值。否则用当前key-value构建Entry对像,并入当前桶内,桶内元素链到新Entry后面.与null思路相同.

到这里get方法,就不用多说了,首先用key的hashCode 进行hash(参考HashMap的hash方法),用所得值定位桶号.遍历桶内链表,找到该KEY值的Entry对像,返回VALUE.反不到,则返回NULL,简单着呢.

回到网友贴子上来,如何快速查找KEY? hashMap通示计算得的HASH值快速定位到元素所在的桶,这样就排除了绝大部分元素,遍历其内的小链表就很快了.如果用链表把所有元素链起来,时间可想而知.

HashMap唯一高明之处在于他的Hash算法(不太明白):

 static int hash(int h) {
        // This function ensures that hashCodes that differ only by
        // constant multiples at each bit position have a bounded
        // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
 }.

另外 transient Entry[] table中的transient是什么意思,下一篇再说吧,欢迎拍砖. 

上一页  1 2 

Tags:JAVA HASHMAP 原理

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接