- package
integer; -
- public
class IntegerTest { -
-
public static void main(String[] args) { -
// TODO Auto-generated method stub -
Integer a1 = 127, a2 = 127, b1 = 128, b2 = 128; -
System.out.println(a1==a2); -
System.out.println(a1.equals(a2)); -
System.out.println(b1==b2); -
System.out.println(b1.equals(b2)); -
} -
- }
true
true
false
true
JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。
以上是靠整型数的自动拆装箱实现的,而两者的结果却不相同。
原因在于,在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。
2、以下是Integer.valueof()的源代码:
- public
static Integer valueOf(int i) { -
assert IntegerCache.high >= 127; -
if (i >= IntegerCache.low && i <= IntegerCache.high) -
return IntegerCache.cache[i + (-IntegerCache.low)]; -
return new Integer(i); -
}
简单地解释这段代码,就是如果传入的int在IntegerCache.low和IntegerCache.high之间,那就尝试看前面的缓存中有没有打过包的相同的值,如果有就直接返回,否则就创建一个Integer实例。IntegerCache.low 默认是-128;IntegerCache.high默认是127.
注:如果要比较两个对象的内容是否相同,尽量不使用== 或者!= 来比较,可以使用equal()来实现。