一、区别
1.Integer是int的包装类,int则是java的一种基本的数据类型;
2.Integer变量必须实例化之后才能使用,而int变量不需要实例化;
3.Integer实际是对象的引用,当new一个Integer时,实际上生成一个指针指向对象,而int则直接存储数值
4.Integer的默认值是null,而int的默认值是0。
二、比较
首先这里要区分一下 “==” 和 equals 的区别:
- “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。
- equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
所以根据上面的解释我们知道,int是基本数据类型,而Integer是对象的引用。所以在比较时是有区别的。这里着重以 “==”来区分,因为“==”比较对象和引用时是不同的。
1.Int 和 Int 比较
Int为基本数据类型,使用 "==" 比较,直接比较的是其存储的值。
2.Integer 和 Int 比较
Integer变量和int变量进行比较时,java会自动拆箱为int,然后进行比较,实际上就是两个int变量进行比较,与2中int和int的比较相同。
3.Integer 和 Integer 比较
Integer是Integer对象的引用,所以两个通过new生成的Integer是两个不同的对象,其内存地址也不同,因此变量永远是不相同的。
注意以下俩种情况:
第一种:
非new生成的Integer变量指向的是Java常量池中的对象,new生成的Integer变量指向堆中新建的对象,两者在内存中地址不同。
第二种:
此处两个Integer类均为对象引用比较应该用equals,而这里使用==判断地址,结果本应该是false,但打印出来却是true,这是为什么?
首先,直接声明 Integer a = 100;
的时候,Java自动装箱为Integer a = Integer.valueOf(100);查看Integer类的valueOf方法:
// range [-128, 127] must be interned (JLS7 5.1.7)
// static final int low = -128;
// assert IntegerCache.high >= 127;
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
发现,当 i>=-128并且 i<=127的时候,第一次声明会将 i 的值放入缓存中,第二次直接复用缓存里边已有的对象,而不是重新创建一个Integer对象。这个区间内的Integer值可以直接使用 == 判断,但这个区间外的所有数据,都会在堆上产生,并不会复用已有对象。所以就会出现一种我们平时比较容易出错的情况,当使用 “==” 比较俩个值相等的Integer 引用时,当比较的值在 i>=-128并且 i<=127 这个区间内时,则相等,不在此区间则不等。因此我们在比较俩个Integer类型时,尽量使用equals来进行比较。