Java Integer

int的包装类

作为包装类,给数字装备了各种操作方法
代码版本java8

取值范围


Java int型占位4个byte 最小值-231 最大值231-1

Integer.java
1
2
@Native public static final int   MIN_VALUE = 0x80000000;
@Native public static final int MAX_VALUE = 0x7fffffff;

位操作


找最高位的1
右移1位并进行或操作,那么最高位1传递给了低位,现在最位和下一位都是1
再右移两位或操作,那么最高位和接下来三位都是1
以此类推,最高的1会将所有低位都置为1,接下来只需减掉所有低位即可

Integer.java
1
2
3
4
5
6
7
8
9
public static int highestOneBit(int i) {
// HD, Figure 3-1
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >>> 1);
}

找最低位的1
负值相当于求反加1,最低位的1刚好是进行进位的,只要进行与操作即可

Integer.java
1
2
3
4
public static int lowestOneBit(int i) {
// HD, Section 2-1
return i & -i;
}

装拆箱


装拆箱发生在编译阶段

ValueOf装箱

valueOf并不总是创建新的对象,维护缓存,[-128, 127]之间都是返回缓存
JVM参数-XX:AutoBoxCacheMax可以改变缓存范围,只针对Integer类型生效

Integer.java
1
2
3
4
5
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

valueOf就是装箱的本质

Sample
1
2
3
4
5
Integer a = 100, b = 100;
System.out.println(a == b); //true,缓存范围,都是同一对象
System.out.println(a == new Integer(100)); //false,new总是创建新对象
Integer c = 200, d = 200;
System.out.println(c == d); //false,超出范围,创建不同对象

intValue拆箱

intValue方法是拆箱的本质

Integer.java
1
2
3
public int intValue() {
return value;
}

Integer和int比较时先拆箱再比较

Sample
1
2
3
Integer a = 200;
int b = 200;
System.out.println(a == b); //true, 拆箱后值相等

同时Interger还提供其他类型的强转方法

Integer.java
1
2
3
4
5
6
public short shortValue() {
return (short)value;
}
public long longValue() {
return (long)value;
}