目录
案列
public class IntegerTest {
public static void main(String[] args) {
for (int i = 0; i < 150; i++) {
Integer a = i;
Integer b = i;
System.out.println(i + ":" + (a == b));
}
}
}
结果:从 0 到 127 均显示两个变量相等,而从 128 开始不相等?
0:true
1:true
2:true
3:true
......
126:true
127:true
128:false
129:false
130:false
......
案列分析
自动装箱机制
Integer a = 1;
- 变量
a
为Integer
类型,而1
为int
类型,且Integer
和int
之间并无继承关系,按照Java
的一般处理方法,这行代码应该报错 - 但因为自动装箱机制的存在,在将
int
类型的值赋给Integer
类型变量(引用变量)时,Java
会自动将int
类型转换为Integer
类型,即
Integer a = Integer.valueOf(1);
valueOf()
方法返回一个 Integer
类型的引用变量。这就是 int
的自动装箱
是否是同一个对象
最开始的案列,每次循环时,Integer a = i
和 Integer b = i
都会触发自动装箱机制,而自动装箱机制会将 int
转换 Integer
类型变量(引用变量)并返回,Integer
类是 int
类型数据的包装类;我们知道 Java
中两个 new
出来的对象,因为是不同的实例,所以无论如何 ==
都会返回 fasle
// 返回 false
new Integer(1) == new Integer(1);
那么上述案列中 Integer a = i
和 Integer b = i
自动装箱产生的引用变量 a
和 b
就不应该时同一个对象了,那么 ==
的结果应该是 false
128
以上为 false
容易理解,但为何 0
到 127
时返回 true
了呢? ==
返回 true
的唯一情况是比较的两个对象为同一个对象,那不妨把例子中 a
和 b
的内存地址都打印出来看看
public class IntegerTest {
public static void main(String[] args) {
for (int i = 0; i < 150; i++) {