java中自动装箱拆箱的陷阱


本人曾经实习面试的时候遇到的一个java自动装箱的陷阱,当时就是不太明白,回来自己琢磨了一下这个问题,在此作为总结,希望让刚开始接触java的同学以后避免这个坑!好了废话不多说,直接贴出这段代码:

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));	        
	}

大家看到这段代码不妨自己先琢磨一下答案,这其实就是java自动装箱的一个非常常见的陷阱。在讲解这个问题之前,非常有必要说一个java规范:特定的基本类型一定得被box成相同的包装类型。这些对象会被高速缓存以重复使用,并且会被当做一般对象使用。这些特殊的值是boolean值的true和false、所有的byte值、介于-128至127的short与int值,以及介于\u0000与\u007F之间的任何一个char

大家在理解上面所说的java规范,可能前两条的结果大家已经可以的出来了,由于介于-128至127的int值都会被高速缓存以重复使用,所以第一个输出的结果为true,相反第二条输出的结果为false。接下来再来讲解后面四条输出语句,鉴于包装类的“==”运算在不遇到算术运算的情况是不会自动拆箱的原则,可以知道第三条的c会拆箱成int,同时(a+b)会拆箱成int类型相加,然后和c进行比较,这样大家应该猜到第3和第5输出语句都为true。最后再来说一说第4和第6两条输出语句,如果我们在eclipse中,我们首先可以Ctrl第4条输出语句的equals方法,看看里面的源代码:

 public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

如果大家理解了(a+b)过程,那么自然就会得到答案,因为传入的参数确实为Integer类型,所以第4条语句的结果为true。接着我们可以Ctrl第6条输出语句的equals方法:

public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }

因为传入的参数为Integer类型,所以 if条件判断不成立,返回false。所以最后一条输出语句的结果为false。

最后贴上答案:

true
false
true
true
true
false

以上都是本人自己的理解过,若有不妥之处,请指正!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值