1、int是java中的一种的基本数据类型,Integer是int的包装类;
2、int直接存储数据,而Integer则是存储的指向对象的地址;
3、int的初始值为0,Integer的初始值为null。
场景分析
1、由于Integer是实例化一个对象的引用,所以通过new关键字实例化的两个Integer对象,一定不同(存储的地址不一样)
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
false
2、当Integer变量和int变量进行比较时,只要值相同,一定返回true。(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
Integer i1 = new Integer(999);
int i2 = 999;
ture
3、非new生成的Integer变量和new生成的Integer对象进行比较,一定不相等。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
Integer i1 = 100;
Integer i2 = new Integer(100);
false
4、当对Integer变量直接赋值时(Integer i = 100;),如果int类型值和他相同,且在[-128, 127]内,那么进行比较会返回true
Integer i1 = 100;
int i2 = 100;
true
关于第四种情况,下面给出解释:
java在编译 Integer i = 100 ; 时,会翻译成为 Integer i = Integer.valueOf(100);,而java API中对Integer类型的valueOf的定义如下:
至于为什么会出现这种情况,可以看看下面的代码:
public static Integer valueOf(int i){
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high){ // 如果范围在[-128, 127]内
return IntegerCache.cache[i + (-IntegerCache.low)];
}
return new Integer(i); // 不在那个范围则在堆中创建一个Integer对象
}
java对于[-128, 127]内的数,会进行缓存(放在常量池,这就是基本数据类型的原理),如执行Integer i1 = 100语句时,会将100进行缓存,下次再写Integer i2 = 127时,就会直接从缓存中取。
网友评论