Javaで2つのIntegerオブジェクトを追加したときの内部的な振る舞いを説明することができますか?それは、この中にコンパイルだIntegerオブジェクトを2つ追加したときの内部での操作は?
Integer sum = new Integer(2) + new Integer(4);
Javaで2つのIntegerオブジェクトを追加したときの内部的な振る舞いを説明することができますか?それは、この中にコンパイルだIntegerオブジェクトを2つ追加したときの内部での操作は?
Integer sum = new Integer(2) + new Integer(4);
(それはプリミティブにUnboxのオブジェクトであり、その後、2つの整数を追加し、最終的にIntegerオブジェクトにそれを箱入りのように):
Integer sum = Integer.valueOf(new Integer(2).intValue()+new Integer(4).intValue());
あなたはバイトを調べることでこれを確認することができますjavap -c
で得られたコード解体。ここ
スタックにINT 2を残し、新しい整数(2).intValue()に相当する部分である:ここ
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: invokevirtual #4; //Method java/lang/Integer.intValue:()I
新しい整数(4).intValue(に相当する部分でありますスタックにINT 4を残す):合計2 + 4はiadd
で計算され
11: new #2; //class java/lang/Integer
14: dup
15: iconst_4
16: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
19: invokevirtual #4; //Method java/lang/Integer.intValue:()I
そしてここで、合計はInteger.valueOf
呼び出しによって整数に箱詰めされ、その結果が最初にローカルに格納されます。変数(astore_1
):
22: iadd
23: invokestatic #5; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
26: astore_1
2つのInteger
インスタンスの作成。
これらの2つのインスタンスの自動アンボックス。
new int
結果を保持します。
結果をInteger sum
インスタンスに自動ボクシングします。