码迷,mamicode.com
首页 > 编程语言 > 详细

HashMap中一个精巧算法 tableSizeFor(int cap)

时间:2017-10-14 20:04:12      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:nal   bsp   col   ret   xxxx   hashmap   次方   第一个   xxxxxx   

源码如下:

static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

主要功能是:返回一个大于等于且最接近 cap 的2的幂次方整数,如给定9,返回2的4次方16。

 
这个算法的大致原理: 
假定cap也就是给定数的的形式为00..01XXXXXXX,(X代表可为0也可为1,X前面的1为从最高位开始第一个为1的那一位) 
第一步: n |= n >>> 1; 也就是n变为n与n右移一位之后异或后的值,即 
n: 00..01XXXXXXX 
n>>>1: 00..001XXXXXX 
新n: 00..011XXXXXX 
第二步: n |= n >>> 2; 也就是n变成n与n右移两位之后异或的值,即 
n: 00..011XXXXXX 
n>>>2: 00..00011XXXX 
新n: 00..01111XXXX 
后面相类似。

这个算法不断地把第一个1后面的位全部变成1。本例由00..01XXXXXXX —> 00..011111111,最后再返回n+1(2的幂次方); 

 

与此类似的方法:

while (capacity < initialCapacity){   //确保容量为2的n次幂;使capacity为大于initialCapacity的最小的2的幂次方
    capacity <<= 1;
}

  

HashMap中一个精巧算法 tableSizeFor(int cap)

标签:nal   bsp   col   ret   xxxx   hashmap   次方   第一个   xxxxxx   

原文地址:http://www.cnblogs.com/don1911/p/7668101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!