一、什么是128陷阱
在我们比较Integer类型的两个数据时会发现,明明两个相同的值,最后比较结果为false,这就是所谓“Java128陷阱”
Integer n1 = 128;
Integer n2 = 128;
System.out.println(n1 == n2);
二、理解128陷阱 (自动装箱与自动拆箱)
首先理解自动装箱与自动拆箱
在上面的示例中我们用Integer定义的数其实是简写形式,正确的写法:(自动装箱)
Integer n1 = Integer.valueOf(128);
Integer n2 = Integer.valueOf(128);
Integer就是int的包装类,自动装箱就是将基本数据类型转换为包装类;自动拆箱就是将包装类转换成基本数据类型
Integer d = 10;//自动装箱 Integer b = Integer.valueOf(10);
int e = d; //自动拆箱 int e = d.intValue
128陷阱出现的原因就是Integer的valueOf方法中有一个存储[-128-127]的catch数组,这个数组就相当于一个缓存,当我们定义的数在-128-127之间时,就直接返回该内存中的地址
Integer中的valurOf方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
所以当我们用==比较两个用Integer定义值为128的数时,会返回false,此时n1和n2是封装在两个对象中,比较应用.equals()方法
Integer n1 = 128;
Integer n2 = 128;
System.out.println(n1.equals(n2));
这就是所谓的128陷阱