public static void main(String[] args)
{
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a==b);
System.out.println(c==d);
}
输出结果:
true
false
上面的现象即JAVA的128陷阱, 看起来很不可思议吧
这是JAVA包装器与自动装箱的结果
先说几个定义:
Integer类是基本类型int的包装类,通常,这种类称为包装器。(Interger,Long,Float,Double,Short,Byte,Character,Void,Boolean)
有一个方法:
void func1 (Integer)
这样调用:
func1(1);
//实际上等于这样:
func(Integer.valueOf(1));
这种int到Integer的变换被称为装箱。
反过来,有一个Interger对象赋予给int是,也会自动拆箱。
自动装箱规范要求boolean、byte、char<=127,介于-128-127之间的 short 和 int 类型被包装到固定对象中。
Java对在-128-127之间的Integer值,用原生数据类型int,会在内存里供重用,
也就是说这之间的Integer值进行==比较时只是进行int原生数据类型的数值比较,
而超出-128-127的范围,进行==比较时是进行地址比较。(引用数据类型用==比较,则是对他们的地址进行比较)
而Integer的自动装箱代码:
public static Integer valueOf(int i)
{
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.