Java 基本数据封装类自动装箱与拆箱

public class Test {
/**
* @param args
*/
public static void main(String[] args) throws Exception {

(1) Long t = new Long(1);
(2) System.out.println(t+1);

(3) Long t2 = t + 1;
(4) System.out.println(t2);
}
}

[color=darkblue](2)t+1过程:t.longValue + 1;
(3)t+1过程:t.longValue + 1得到long型值A,再调用Long.valueOf(A)变成Long给t2.[/color]


javap的代代码:
new #19; //class java/lang/Long
dup
lconst_1
invokespecial #21; //Method java/lang/Long."<init>":(J)V
astore_1
getstatic #24; //Field java/lang/System.out:Ljava/io/PrintStream;
aload_1
invokevirtual #30; //Method java/lang/Long.longValue:()J
lconst_1
ladd
invokevirtual #34; //Method java/io/PrintStream.println:(J)V
aload_1
invokevirtual #30; //Method java/lang/Long.longValue:()J
lconst_1
ladd
invokestatic #39; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;

astore_2
getstatic #24; //Field java/lang/System.out:Ljava/io/PrintStream;
aload_2
invokevirtual #43; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V


另外,注意在做等值比较时,要注意了,因为这里非常容易被忽略而导致程序bug。
它们是按照声明的类型进行的,如果有基本数据类型,则封装类会自动转型为基本数据类型再进行比较;如果封装类使用equals,则后面的基本数据类型自动转成封装类:
		
Integer t1 = new Integer(1);//等同于:Integer t1 = 1;
Integer t2 = new Integer(1);//等同于: Integer t2 = 1;
(5)System.out.println("t1==t2:" + (t1==t2));
(6)System.out.println("t1==1:" + (t1==1));
(7)System.out.println("t2==1:" + (t2==1));
(8)System.out.println("t2.equals(1):" + (t2==1));[/

输出为:
[color=blue]t1==t2:false
t1==1:true
t2==1:true
t2.equals(1):true[/color]
原因:
(5):t1 t2都按封装类进行等值比较,属于不同的对象,所以不相等;
(6):t1自动转成int型,再与1相比,值是相等的;
(7):t2自动转成int型,再与1相比,值是相等的;
(8):1自动转成new Integer(1),再与t2做equals,他们的值也是相等的。

建议:用equals来替换==,这样可以省去麻烦,避免错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值