论坛首页 Java企业应用论坛

知道为啥HashMap里面的数组size必须是2的次幂?

浏览 6449 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-02-17  
sniffer123 写道
LZ你自己的写法有问题啊。。跟HASH是不是 2的幂一点关系也没有
hash & (LOCK_NUM - 1) 能等同 hash % (LOCK_NUM - 1)吗?
假如LOCK_NUM = 14,那么 (LOCK_NUM - 1) 就是 二进制 1101
你用&,第二位永远都是会被去掉的,简单点说,如果hash 是 1~100,&后出来的结果分布肯定是不平均的
之所以会出现你那个只要是2^n就会分布平均,是因为这个时候,2^n的二进制是 1111,&出来相当于取低四位。


恩,在SplitReentrantLock 中使用hash & (LOCK_NUM - 1)确实达不到平均分布的要求。
直接拷贝hashMap.index(...),刚开始没注意,测试过后才发现的。

我没说和hash值有关。
只是和数组的长度有关。

0 请登录后投票
   发表时间:2011-02-18  
LZ分析有道理,最后的&操作,(LOCK_NUM - 1)的二进制1越多,越是平均分布,反过来说,也就是2^n会平均分布。
0 请登录后投票
   发表时间:2011-02-18  
楼主为什么要自己实现分离锁呢?

java.util.concurrent.ConcurrentHashMap<K,V>
这个已经帮你搞定了
0 请登录后投票
   发表时间:2011-02-18  
javantsky 写道
楼主为什么要自己实现分离锁呢?

java.util.concurrent.ConcurrentHashMap<K,V>
这个已经帮你搞定了



分离锁和Map没什么必然的关系呀。
分离锁的应用场景和Map的应用场景不同呀。

要求这样:
SplitReentrantLock locks = new SplitReentrantLock(16);
  Lock lock =locks.getLock(key); 
  lock.lock();
  try{
     //......
   }finally{
   lock.unlock(); 
   }





0 请登录后投票
论坛首页 Java企业应用版

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