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

Java代码   收藏代码
  1. public class Test {  
  2.     /** 
  3.      * @param args 
  4.      */  
  5.     public static void main(String[] args) throws Exception {  
  6.   
  7.     (1) Long t = new Long(1);  
  8.     (2) System.out.println(t+1);  
  9.           
  10.     (3) Long t2 = t + 1;  
  11.     (4) System.out.println(t2);  
  12.     }  
  13. }  

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


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,则后面的基本数据类型自动转成封装类: 
Java代码   收藏代码
  1. Integer t1 = new Integer(1);//等同于:Integer t1 = 1;  
  2. Integer t2 = new Integer(1);//等同于: Integer t2 = 1;  
  3. 5)System.out.println("t1==t2:" + (t1==t2));  
  4. 6)System.out.println("t1==1:" + (t1==1));  
  5. 7)System.out.println("t2==1:" + (t2==1));  
  6. 8)System.out.println("t2.equals(1):" + (t2==1));[/  

输出为: 
t1==t2:false 
t1==1:true 
t2==1:true 
t2.equals(1):true
 
原因: 
(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、付费专栏及课程。

余额充值