想要了解Java的128陷阱是什么,首先要了解三个基本的概念
-
包装器类型
- 所有的基本类型都有一个与之对应的类。通常,这些类称为包装器(wrapper) ,可用于将int这样的基本类型转换为对象。
- 这些对象包装器类拥有显而易见的名字:Integer、Long、Float、Double、Short、 Byte、Character和Boolean(前6 个类派生于公共的超类Number)。
- 包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,包装器类还是final,因此不能派生它们的子类。
- 应用在要定义一个整型数组列表,但尖括号中的类型参数不允许是基本类型,也就是说,不允许写成ArrayList< int >。
- 这里就可以用到Integer 包装器类我们可以声明一个Integer 对象的数组列表。
ArrayList list = new ArrayList<>();
-
自动装箱
- 调用list.add(7);向ArrayLis添加int类型的元素。将自动地变换成list.add (Integer.valueof(7)) ;这种变换被称为自动装箱
(autoboxing)。
- 调用list.add(7);向ArrayLis添加int类型的元素。将自动地变换成list.add (Integer.valueof(7)) ;这种变换被称为自动装箱
-
自动拆箱
- 把Integer对象赋给一个int 值,
int n = list.get(i);
将会自动的转换成
int n =list.get(i) .intvalue() ;
这叫做自动地拆箱。
- 把Integer对象赋给一个int 值,
128陷阱
package January15;
/**
* @author Mi
* @version 1.0
* @description: TODO
* @date 2022/1/15 21:37
*/
public class XianJIng128 {
public static void main(String[] args) {
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1 == num2);
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num3 == num4);
}
}
上述代码执行后的结果为
这是因为,在Integer的valueOf()方中,当数值在-128-127之间时,数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等。