12. Integer a= 127 与 Integer b = 127相等吗
大约 2 分钟
在Java中,当你执行Integer a = 127;
和Integer b = 127;
时,a
和b
是相等的。
原因
在Java中,Integer
对象的赋值涉及到**自动装箱(Autoboxing)**机制,即将基本数据类型int
转换为包装类型Integer
。Java为了优化内存使用,对某些范围内的Integer
对象进行了缓存。
- Java中的
Integer
类对-128
到127
范围内的整数进行了缓存,也就是当你创建一个在这个范围内的Integer
对象时,它实际上是从缓存池中获取一个已经存在的对象,而不是创建一个新的对象。
因此,在这段代码中:
Integer a = 127;
Integer b = 127;
- 由于
127
在缓存范围内,a
和b
指向的是同一个对象,因此a == b
结果为true
。
代码示例
public class IntegerCacheExample {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // 输出: true
System.out.println(a.equals(b)); // 输出: true
}
}
超出缓存范围的情况
如果将Integer
的值设置为不在-128
到127
范围内的值,例如:
Integer x = 128;
Integer y = 128;
在这种情况下,x
和y
不会指向同一个缓存对象,而是两个不同的Integer
对象,因此x == y
将返回false
。
public class IntegerCacheExample {
public static void main(String[] args) {
Integer x = 128;
Integer y = 128;
System.out.println(x == y); // 输出: false
System.out.println(x.equals(y)); // 输出: true
}
}
总结
- 缓存机制:Java对
-128
到127
范围内的Integer
对象进行了缓存,因此在这个范围内的Integer
对象是相等的(==
)。 - 超出缓存范围:如果值超出
-128
到127
,则每次创建Integer
对象时都会创建新的对象,所以不相等(==
返回false
)。
这就是为什么Integer a = 127
和Integer b = 127
相等,而Integer x = 128
和Integer y = 128
不相等的原因。