在前两篇博文, 我们讨论了比较运算符 "==", 还重点剖析了字符串变量使用 "==" 运算的规则, 得出了以下结论, 即: 当两个变量的值相等时 (无论是基本类型变量还是引用类型变量),"==" 比较运算的结果会返回 true.
这篇博文, 我们重点剖析 Java 的包装类 Integer 使用 "==" 运算的规则, 首先看一个简单的例子:
- public class IntegerTest
- {
- public static void main(String[] args)
- {
- // 定义两个 Integer 对象
- Integer i1 = 8;
- Integer i2 = 8;
- // 打印 8== 8 :true
- System.out.println(i1 + "==" + i2 +":" + (i1== i2));
- // 再次定义两个 Integer 对象
- Integer i11 = 128;
- Integer i12 = 128;
- // 打印 128== 128 :false
- System.out.println(i11 + "==" + i12 +":" + (i11== i12));
- }
- }
程序第 6 行, 7 行定义了两个 Integer 对象 i1,i2, 它们的值都是 8 , 第 9 行打印 "==" 运算的结果为: 8== 8 :true. 接着, 在第 11 行, 12 行定义了两个 Integer 对象 i11,i12, 它们的值都是 128 , 第 14 行打印 "==" 运算的结果为: 128== 128 :false. 同样是定义 Integer 对象, 同样的赋值, 但程序却出现了不同运行结果! 是不是让人感到莫名其妙呢?
下面, 我们用 Java 的 "==" 运算规则对上面的结果进行分析, 即: 当两个变量的值相等时 (无论是基本类型变量还是引用类型变量),"==" 比较运算的结果会返回 true; 否则返回 false:
1, 第 9 行程序返回 true, 说明 i1,i2 在内存中的值相同, 又因为它们是 Integer 包装类, 属于引用类型, 也就是说, i1,i2 的值指向同一个对象.
2, 第 14 行程序返回 false, 说明 i11,i12 在内存中的值不同, 也就是说, i11,i12 的值指向不同的对象.
上面的分析结论可以通过分析 java.lang.Integer 类的源代码得到进一步证实:
Integer 类把 - 128----127 之间的整数自动装箱成 Integer 实例, 并放入了一个名为 cache 的数组中缓存起来. 当把一个 - 128----127 之间的整数自动装箱成一个 "Integer" 实例时, 会指向一个 cache 数组的元素, 而同一个整数的包装实例会指向同一个 cache 数组的元素; 不在 - 128----127 范围之间的整数则总是重新创建一个 Integer 实例. 因此, 出现了以上的运行结果.
Java 之所以采用这种方式, 主要是考虑 "缓存" 的设计模式, 以提高系统的运行性能. 在这里, 笔者也提出一些疑问: 这种设计模式虽然提高了系统的性能, 但同时也会为开发者带来太多的意外, 费解, 这种设计模式是必须的吗? 值得这样设计吗?
来源: https://blog.csdn.net/weixin_37460579/article/details/104094109