java中的int和Integer虽然都表示整数,可它们实际上是不同的,如果不理解其中区别有时候会出现莫名其妙的问题。
我们来看下面几种情况
一
int a = 1;
int b =1;
System.out.println(a==b)
比较结果为true,这符合正常逻辑,1==1结果自然为true
二
Integer a= new Integer(1);
Integer b= new Integer(1);
System.out.println(a==b)
比较结果却为false,因为a和b是两个不同的对象,虽然值都为1,可引用的地址却不同,为对象应用==运算符, 比较的是应用地址,为值类型应用==运算符,比较的才是真正的值,这里是比较对象,结果就为false了。
三
Integera = 127;
Integerb = 127;
System.out.println(a ==b);
比较结果为true,这令人疑惑,上面不是说Integer类型是比较引用的, 那么这里是两个不同的对象,以为着有不同的引用,结果为何为true。 这是因为直接为Integer类型赋值值类型时设计到一个自动装箱操作,编译器会调用Integer.valueOf方法来实现这个效果,实际上编译起执行的代码大概是像下面这样子的
Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
System.out.println(a ==b);
我们再看valueOf方法的代码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low &&i <= IntegerCache.high)
return IntegerCache.cache[i +(-IntegerCache.low)];
return new Integer(i);
}
当参数值在-128和127之间时,返回的是IntegerCache.cache中的缓存值,因此结果才为true,因为valueOf返回的是同一个对象。而当参数值不在范围内时,valueOf方法会通过newInteger创建一个新的对像, 所以
Integer a = 128;
Integer b = 128;
System.out.println(a ==b);
以上代码执行的结果就为false了,因为每次调用valueOf方法,方法都回调用new Integer创建一个全新对象,而不是复用缓存中的对象。
四
int a = 128;
Integer b = 128;
System.out.println(a ==b);
结果为true, 因为当把Integer类型与int比较时, 编译器会味Integer类型执行拆箱操作:将Integer转换为int, 那么时间上最终==运算符的两侧都会是int类型,对于值的比较只要值是相等的,那么结果即为true。
综上所述,在不考虑性能的情况下,使用int而不适用Integer能提高程序的正确性,因为对int的数值操作逻辑更加简单安全。
网友评论