论坛首页 Java企业应用论坛

深入理解HashMap

浏览 130375 次
该帖已经被评为精华帖
作者 正文
   发表时间:2009-12-03  
dennis_zane  大大牛!
0 请登录后投票
   发表时间:2009-12-03  
我爱JavaEye!
0 请登录后投票
   发表时间:2009-12-03  
annegu 写道
楼主我现身啦~

zhang_xzhi_xjtu 写道

java的hash实现用的是除法求模的方式,是设计一个hash算法最简单的方式之一。
而return h & (length-1);只不过是当length为2的幂的时候的一种求模的代码级的优化而已。为了速度。


这句话是对的,用“与”操作确实是为了速度。

zhang_xzhi_xjtu 写道

如果hashmap的size是15或者其他值时,这行代码会变为return h%size;如此而已。


这是错的!hashmap的代码里面根本没有“%”。hashmap的table[]的大小也不会是15这种不是2的次方的,table的大小一定是2次幂。看下面:

// Find a power of 2 >= initialCapacity
        int capacity = 1;
        while (capacity < initialCapacity) 
            capacity <<= 1;
        table = new Entry[capacity];


注意如果。
我是为了说明这个算法没有天生的空值缺陷。
0 请登录后投票
   发表时间:2009-12-03  
火星来客 写道

因为java选择2的幂作为size,所以用&进行了code级别的优化。

继续吧
讨论因果问题。先有鸡还是先有蛋。

你认为因为用2的幂作为size,所以用&操作。

我认为因为用&操作,所以用2的幂作为size.
而使用&操作就是为了避免%

这个问题每个人的想法不一样,也不强求别人非得同意自己的看法
0 请登录后投票
   发表时间:2009-12-03  
hashcode & (length - 1)中length为2的幂次方,这样&表达式右边二进制全为1,目的有二:1、无论hashcode为何值都可以得到0 ~ length-1的数组索引。2、由于&右边全是1,所以可以更好地设计hash函数以减少碰撞次数,由hash()方法决定,而不管其它。
0 请登录后投票
   发表时间:2009-12-03  
只要同意求模的hash作为算法没有空值缺陷就好了,其他不用讨论了。

鸡蛋问题还是很有意思的

一般如下:

甲:先有鸡
乙:那这个鸡怎么来的,还不是蛋孵出来的
甲:那先有蛋
乙:那这个蛋怎么来的,还不是鸡生出来的


我的想法如下

这个命题应该是讨论的是概念的问题,而不是具体的一只鸡或者一个蛋。
而乙则不停的把概念和实例混在一起。

这里的重点应该是鸡和蛋的作为概念定义问题。
我自己尝试定义一下:

鸡蛋的定义 是鸡下的蛋或者可以孵出鸡的蛋。
鸡的定义
1 是模模糊糊,我只能用常识来理解,从小别人把这个叫鸡,然后习惯了。
2 鸡蛋孵出的东西,或者可以下鸡蛋的东西。


有可能这是个互相引用来定义的概念。

根据剃刀法则,我想认识鸡的概念简单一点,于是鸡蛋是由鸡的概念来定义的,当然不排除有人觉得鸡蛋的概念简单先接受了,才用鸡蛋的概念来定义鸡。

这里提下字典,字典的释义充满了循环引用,但是人们还是可以理解。估计剃刀法则还是起到一定作用的。

0 请登录后投票
   发表时间:2009-12-03  
讲得很好,很仔细
0 请登录后投票
   发表时间:2009-12-03  
luobo25 写道
当length=2^n时,hashcode & (length-1) == hashcode % length,难怪这么巧 ,楼主的研究有价值

以前看HashMap时真没想过为什么构造时选2^n做为初始容量,豁然开朗啊
0 请登录后投票
   发表时间:2009-12-03  
haojia0716 写道
我正准备发言,发现这个人说的和我想说的一模一样.


langyu 写道
hashcode & (length - 1)中length为2的幂次方,这样&表达式右边二进制全为1,目的有二:1、无论hashcode为何值都可以得到0 ~ length-1的数组索引。2、由于&右边全是1,所以可以更好地设计hash函数以减少碰撞次数,由hash()方法决定,而不管其它。



没错,就是这两点原因.


别吓我,难道我们思想共通~~

以前第一次看HashMap代码时,对这部分就这个理解的
0 请登录后投票
   发表时间:2009-12-03  
看完收获很大!请问annegu是男是女?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics