关于java自动拆箱,装箱的陷阱

本文通过一个Java示例详细解析了自动拆箱装箱的过程及原理,特别是针对Integer对象在不同情况下的比较行为进行了深入探讨。文章解释了为何在特定数值范围内Integer对象可以直接比较,而在范围外则会产生不同的比较结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 自动拆箱装箱案例
 * @author Administrator
 *
 */
public class ChaiXiang {
	public static void main(String[] args) {
		Integer a = 1;
		Integer b = 2;
		Integer c = 3;
		Integer d = 3;
		Integer e = 321;
		Integer f = 321;
		Long g = 3l;
		System.out.println(c == d);
		System.out.println(e == f);
		System.out.println(c == (a + b));
		System.out.println(c.equals(a + b));
		System.out.println(g == (a + b));
		System.out.println(g.equals(a + b));
	}
}

运行结果为:

true
false
true
true
true
false

为什么第二个为false,第一个为true?为什么最后一个为false

让我们看一下Integer的源码

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

默认IntegerCache.low 是-128,Integer.high是127,如果在这个区间内,他就会把变量i当做一个变量,放到内存中;但如果不在这个范围内,就会去new一个Integer对象,所以,这就是第一个为true的原因。

第二个为false是因为包装类的“==”运算在没有算术运算的情况下不会自动拆箱,并且创建了一个新的对象。

第三,四,五因为“==”运算有算术运算所以自动拆箱为int类型,所以他们的结果为true

最后一个为false是因为equals方法不会处理数据类型转换的关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值