java 自动装箱遇到的问题

今天在书上看到一段代码,然后……就懵逼了,百度过后终于知道了为什么,分享给大家。


package com;

public class Test {

	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


首先第一个问题:为什么 c = d 而e != f ?

这里涉及到一个概念,常量池。Integer的常量池从-128到127。在这个范围的数字可以直接从常量池取得值。所以3 = 3。

然后不在这个范围的数字,会通过new Integer();进行包装,所以产生的是两个对象。

第二个问题:== 等号比的是什么?

==是值得比较,如果左右的值相同,则返回true。而这里大于127的数字被封装成了对象。所以两个不同的对象比较,所以返回false。

第三个问题:==与equals 的区别?

在object 中的equals方法, 

boolean   equals(Object   o){ 

return   this==o; 

} 
所以object 中的equals同==一样。具体实现,需要考虑object的子类是否重写equals方法。

最后一个问题:equals不会自动装箱。当然这也与实现方法有关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值