基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)
最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)java
java 8 中在建立hashMap的时候有个构造函数以下:git
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是初始容量,这个容量通过tableSizeFor加工后就变为了大于输入参数且最近的2的整数次幂的数,固然若是输入参数大于230则会返回230,由于int最大是231-1不是2的倍数,最大的2的次方就是230。github
java8源码以下:算法
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; }
详解以下:函数
先来分析有关n位操做部分:先来假设n的二进制为01xxx...xxx。接着
对n右移1位:001xx...xxx,再位或:011xx...xxx
对n右移2为:00011...xxx,再位或:01111...xxx
此时前面已经有四个1了,再右移4位且位或可得8个1
同理,有8个1,右移8位确定会让后八位也为1。
综上可得,该算法让最高位的1后面的位全变为1。
最后再让结果n+1,即获得了2的整数次幂的值了。
因为int是32位,因此>>>16便能知足。
而关于为啥要int n = cap - 1;
用代码解释吧:
输入以下:this
16 8
若是不减去1获得的结果为16显然不对,输入8的时候不小于输入结果的最小2的次方应该是8。那么这里减一的意义就是避免这种状况。spa
参考文章:
Java8—HashMap之tableSizeFor()
推荐一个写的不错的介绍hashmap的文章:
Java HashMap工做原理及实现code