包装类值判断异常

复现代码

1
2
3
4
5
6
7
8
9
public class Test {
public static void main(String[] args) {
for (int i = 120; i < 130; i++) {
Integer a = i;
Integer b = i;
System.out.println("a == b: " + (a == b));
}
}
}

输出结果

1
2
3
4
5
6
7
8
9
10
a == b: true
a == b: true
a == b: true
a == b: true
a == b: true
a == b: true
a == b: true
a == b: true
a == b: false
a == b: false

原因分析

1
2
3
==是用来比较两个基本数据类型的变量值是否相等,==也用于判断两个对象引用名称是否参考至同一个对象。在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用(就是说内存指向相同),所以造成 System.out.println(a == b); 输出true
如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用(指向了新的内存地址),即相当于每次装箱时都新建一个Integer对象所以 System.out.println("a == b: " + (a == b));输出false
总结:–128到127之间的值内存空间引用的是同一个地址,超出则存在新的内存空间