什么是128陷阱呢?让我们先看一段子代码
package test3;
public class well123 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a==b);
System.out.println(c==d);
}
}
让我们猜猜结果是什么,都返回true么?
但是又觉得哪里不对,也找不到错误。
公布答案了
为什么会这样呢?
我们先要了解下什么java中的自动装箱拆箱机制。
简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
为对于Integer,在(-128,128]之间只有固定的256个值,所以为了避免多次创建对象,我们事先就创建好一个大小为256的Integer数组SMALL_VALUES,所以如果值在这个范围内,就可以直接返回我们事先创建好的对象就可以了。
所以上面代码中的两个比较,a,b比较的是数值,而c,d两个比较的是两个不同的对象,所以返回false.