当前位置: 移动技术网 > IT编程>开发语言>Java > jdk8 HashMap tableSizeFor

jdk8 HashMap tableSizeFor

2019年12月15日  | 移动技术网IT编程  | 我要评论

国徽,兽兽大乱斗2.9,癞蛤蟆有毒吗

今天读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;
    }

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网