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