java.util.HashMap是很常见的类(2)

来源:未知 责任编辑:责任编辑 发表时间:2014-05-10 11:49 点击:

    table = new Entry[capacity]; 
    init(); 

 


重点注意这里

Java代码 
while (capacity < initialCapacity) 
            capacity <<= 1; 
 

capacity才是初始容量,而不是initialCapacity,这个要特别注意,如果执行new HashMap(9,0.75);那么HashMap的初始容量是16,而不是9,想想为什么吧。

构造函数2

Java代码 
public HashMap(int initialCapacity) { 
        this(initialCapacity, DEFAULT_LOAD_FACTOR); 
    } 
 

构造函数3,全部都是默认值

Java代码 
public HashMap() { 
     this.loadFactor = DEFAULT_LOAD_FACTOR; 
     threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); 
     table = new Entry[DEFAULT_INITIAL_CAPACITY]; 
     init(); 
 } 
 

构造函数4

Java代码 
public HashMap(Map<? extends K, ? extends V> m) { 
      this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1, 
                    DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR); 
      putAllForCreate(m); 
  } 
 


如何哈希
        HashMap并不是直接将对象的hashcode作为哈希值的,而是要把key的hashcode作一些运算以得到最终的哈希值,并且得到的哈希值也不是在数组中的位置哦,无论是get还是put还是别的方法,计算哈希值都是这一句:
int hash = hash(key.hashCode());
hash函数如下:
Java代码 
static int hash(int h) { 
  return useNewHash ? newHash(h) : oldHash(h); 
  } 
 

useNewHash声明如下:
 
Java代码 
private static final boolean useNewHash; 
   static { useNewHash = false; } 
 
这说明useNewHash其实一直为false且不可改变的,hash函数里对 useNewHash的判断真是多余的。
Java代码 
private static int oldHash(int h) { 
    h += ~(h << 9); 
    h ^=  (h >>> 14); 
    h +=  (h << 4); 
    h ^=  (h >>> 10); 
    return h; 

 
private static int newHash(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). 

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Java编程语言的八大优点
  • JVM对象生命周期详细介绍
  • Java平台上的CRM系统
  • Java 算数测试小程序
  • Java环境 使用Resin在NT环境下配置JSP环境
  • Command(命令模式)
  • Java 一个简单的画图程序
  • Java 日历的小程序
  • Java 数组的复制
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1