导言
- 先看一下下面的代码,你觉得代码输出的结果是什么
Integer a = 1000;
Integer b = 1000;
Integer c = 100;
Integer d = 100;
System.out.println("a == b is " + (a == b));
System.out.println(("c == d is " + (c == d)));
解释
Integer a = 1000; Integer b = 1000;
* 这段代码创建了两个Integer
对象a
和b
,它们的值都是 1000。由于 Java 的自动装箱机制(Autoboxing),数字 1000 被装箱为两个不同的Integer
对象。 在 Java 中,==
比较的是两个引用的内存地址,而不是值。当数值超出某个范围时(例如 1000 这个值),不会从缓存中复用相同的对象,因此 a 和 b 实际上是指向不同的对象。“所以,a == b
是false
,因为它们是两个不同的对象。”Integer c = 100; Integer d = 100;
这段代码创建了两个Integer
对象c
和d
,它们的值都是 100。Java 的Integer
缓存机制(Integer Cache)会缓存 -128 到 127 之间的Integer
对象,以优化内存使用。由于 100 在这个缓存范围内,所以 c 和 d 实际上指向的是同一个缓存中的对象。换句话说,c 和 d 引用的是相同的内存地址。因此,c == d
是true
,因为它们是同一个对象的引用。
总结
除了Integer
,还有Byte
,Short
,Long
,Boolean
,Character
缓存