Integer底层原理探究
目录
1. int和Integer的区别
● int是基本数据类型,代表整型数据,默认值是0;
● Integer是 int的包装类,属于引用类型,默认值为null;
● int 和 Integer 都可以表示某一个整型数值;
● Integer变量实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值;
● Integer可以区分出未赋值和值为 0 的区别,而int 则无法表达出未赋值的情况;
● int 和 Integer 不能够互用,因为他们是两种不同的数据类型;
● int在初始化时,可以直接写成 int=1 的形式;
● 因为Integer是包装类型,使用时可以采用 Integer i = new Integer(1) 的形式,但因为Java中的自动装箱和拆箱机制,使得对Integer类的赋值也可以使用 Integer i= 1 的形式;
● 如果我们只是进行一些加减乘除的运算 或者 作为参数进行传递,那么就可以直接使用int这样的基本数据类型;但如果想按照对象来进行操作处理,那么就要使用Integer来声明一个对象。
2. 前提知识:
1,装箱存在的情况: int 赋值给Integer 即基本类型赋值给包装类型时
Integer i = 1; 等价于 Integer i = Integer.valueOf(1); java自动完成装箱操作,
2,拆箱存在的情况: int与Integer比较 及基本类型和包装类型比较时
Integer i = new Integer(1); int j = 1; i == j //等价于 i.intValue() == j i对象会自动拆箱int类型和j进行比较
3,IntegerCache是个Integer的内部类,在类加载的时候创建了256个缓存Integer对象,范围-128至127,当生成的对象是这个范围内时默认使用缓存,除非是new 出来的;
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
3. 实验比较:
1,
Integer a=100; Integer b=100; System.out.println(a==b);//true(使用了缓存)
2,
Integer a1=new Integer(100); Integer b1=new Integer(100); System.out.println(a1==b1);//false(都是new出来的两个堆内对象)
3,
Integer a2=100; Integer b2=new Integer(100); System.out.println(a2==b2);//false(一个缓存一个new)
4,
Integer a3=1000; Integer b3=1000; System.out.println(a3==b3);//false(超出缓存范围都是new)
5,
Integer a4=1000; int b4=1000; System.out.println(a4==b4);//true(都转化为int比较)