快速业务通道

JAVA HASHMAP議圻尖蛍裂 - 園殻秘壇利

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
null)              return putForNullKey(value);          int hash = hash(key.hashCode());          int i = indexFor(hash, table.length);          for (Entry<K,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;      }      private V putForNullKey(V value) {          for (Entry<K,V> e = table[0]; e != null; e =  e.next) {              if (e.key == null) {                  V oldValue = e.value;                  e.value = value;                  e.recordAccess(this);                  return oldValue;              }          }          modCount++;          addEntry(0, null, value, 0);          return null;      } }

JAVA HASHMAP的原理分析(2)

时间:2011-04-19 博客园 Christmas

先介绍一下负载因子(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 fa

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号