前言
Integer的底层封装原理简单解析。
一、题目
Integer integer1 = Integer.valueOf(100);
Integer integer2 = Integer.valueOf(100);
System.out.println(integer1==integer2);
Integer integer3 = Integer.valueOf(200);
Integer integer4 = Integer.valueOf(200);
System.out.println(integer3==integer4);
结果:
二、原因
1.Integer底层手动装箱原理
代码如下:
书写MyInteger类
// 缓存类
private static class MyIntegerCache{
private static final int low = -128;
private static final int high = 127;
private static final MyInteger[] cache;
static {
cache = new MyInteger[high-low+1];//256
int j = low;
for (int i = 0; i < cache.length; i++) {
cache[i]=new MyInteger(j++);
}
}
}
// 装箱
public static MyInteger valueOf(int i){
if (i>=MyIntegerCache.low && i<MyIntegerCache.high){
return MyIntegerCache.cache[i-MyIntegerCache.low];
}
return new MyInteger(i);
}
在Integer中存在一个缓存类,其中cache存有-128至127的Integer对象,当调用装箱valueOf方法时,将判断数据是否在-128至127之间,若存在,则调用缓存类中cache数组中的对象;若不存在,则重新new一个新Integer对象。因100在-128至127之间,调用的对象为缓存类中的同一Integer对象;200不在其区间,故每次包装int类型的200时将新建一个Integer对象,故将其比较时结果为false。
总结
当数据在-128至127之间时,两个相同int封装为Integer类型,Integer对象是同一对象;不在这个区间时,将不是同一Integer对象