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

(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,则后面的基本数据类型自动转成封装类:
		
  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));[/

输出为:
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来替换==,这样可以省去麻烦,避免错误。


你可能感兴趣的:(java,J#)