锁定老帖子 主题:深入理解HashMap
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-03
dennis_zane 大大牛!
|
|
返回顶楼 | |
发表时间:2009-12-03
我爱JavaEye!
|
|
返回顶楼 | |
发表时间: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]; 注意如果。 我是为了说明这个算法没有天生的空值缺陷。 |
|
返回顶楼 | |
发表时间:2009-12-03
火星来客 写道 因为java选择2的幂作为size,所以用&进行了code级别的优化。 继续吧 讨论因果问题。先有鸡还是先有蛋。 你认为因为用2的幂作为size,所以用&操作。 我认为因为用&操作,所以用2的幂作为size. 而使用&操作就是为了避免% 这个问题每个人的想法不一样,也不强求别人非得同意自己的看法 |
|
返回顶楼 | |
发表时间:2009-12-03
hashcode & (length - 1)中length为2的幂次方,这样&表达式右边二进制全为1,目的有二:1、无论hashcode为何值都可以得到0 ~ length-1的数组索引。2、由于&右边全是1,所以可以更好地设计hash函数以减少碰撞次数,由hash()方法决定,而不管其它。
|
|
返回顶楼 | |
发表时间:2009-12-03
只要同意求模的hash作为算法没有空值缺陷就好了,其他不用讨论了。
鸡蛋问题还是很有意思的 一般如下: 甲:先有鸡 乙:那这个鸡怎么来的,还不是蛋孵出来的 甲:那先有蛋 乙:那这个蛋怎么来的,还不是鸡生出来的 我的想法如下 这个命题应该是讨论的是概念的问题,而不是具体的一只鸡或者一个蛋。 而乙则不停的把概念和实例混在一起。 这里的重点应该是鸡和蛋的作为概念定义问题。 我自己尝试定义一下: 鸡蛋的定义 是鸡下的蛋或者可以孵出鸡的蛋。 鸡的定义 1 是模模糊糊,我只能用常识来理解,从小别人把这个叫鸡,然后习惯了。 2 鸡蛋孵出的东西,或者可以下鸡蛋的东西。 有可能这是个互相引用来定义的概念。 根据剃刀法则,我想认识鸡的概念简单一点,于是鸡蛋是由鸡的概念来定义的,当然不排除有人觉得鸡蛋的概念简单先接受了,才用鸡蛋的概念来定义鸡。 这里提下字典,字典的释义充满了循环引用,但是人们还是可以理解。估计剃刀法则还是起到一定作用的。 |
|
返回顶楼 | |
发表时间:2009-12-03
讲得很好,很仔细
|
|
返回顶楼 | |
发表时间:2009-12-03
luobo25 写道 当length=2^n时,hashcode & (length-1) == hashcode % length,难怪这么巧 ,楼主的研究有价值
以前看HashMap时真没想过为什么构造时选2^n做为初始容量,豁然开朗啊 |
|
返回顶楼 | |
发表时间:2009-12-03
haojia0716 写道 我正准备发言,发现这个人说的和我想说的一模一样.
langyu 写道 hashcode & (length - 1)中length为2的幂次方,这样&表达式右边二进制全为1,目的有二:1、无论hashcode为何值都可以得到0 ~ length-1的数组索引。2、由于&右边全是1,所以可以更好地设计hash函数以减少碰撞次数,由hash()方法决定,而不管其它。
没错,就是这两点原因. 别吓我,难道我们思想共通~~ 以前第一次看HashMap代码时,对这部分就这个理解的 |
|
返回顶楼 | |
发表时间:2009-12-03
看完收获很大!请问annegu是男是女?
|
|
返回顶楼 | |