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