jdk8 HashMap tableSizeFor

2019-12-14 16:04:19来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

jdk8 HashMap tableSizeFor

今天读jdk8  HashMap源码,构造函数中 根据initialCapacity初始化threshold

public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);//大于initialCapacity的最小的2的幂
}

  其中tableSizeFor 函数看的一脸懵,记录一下

    /**
     * Returns a power of two size for the given target capacity.
     * 取大于capacity的最小的2的幂
     */
    static final int tableSizeFor(int cap) {
        int n = cap - 1;//防止cap正好是2的幂的情况下扩大cap,进行cap<<1的情况
        n |= n >>> 1;//保证n的高位前2位全是1(如果n的第一个1出现在大于第1位的位置,最低位是第0位)
        n |= n >>> 2;//保证n的高位前4位全是1(如果n的第一个1出现在大于第3位的位置)
        n |= n >>> 4;//保证n的高位前8位全是1(如果n的第一个1出现在大于第7位的位置)
        n |= n >>> 8;//保证n的高位前16位全是1(如果n的第一个1出现在大于第15位的位置)
        n |= n >>> 16;//保证n的高位前32位全是1(如果n的第一个1出现在大于第31位的位置)
      /**
       * 经过或运算后 n是低位全是1的值(如0000 0001 1111 1111),n+1后变成高位进1,低位全是0(0000 0010 0000 0000),正好是2的幂
       */
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

 

 

原文链接:https://www.cnblogs.com/fengyanqing/p/12041011.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:什么是RESTful?RESTfule风格

下一篇:可扩展的Java线程池执行器