最初のケースの初期化は、定数値の単純な割り当てです。興味深いことは何もありません...ただし、これは割り当てられているプリミティブ値であり、プリミティブ値には「ID」がありません。int
つまり、値のすべての「コピー」は20
同じです。
2 番目と 3 番目のケースは、もう少し興味深いものです。2 番目の形式は「ボクシング」を使用しており、実際にはこれと同等です。
Integer i = Integer.valueOf(20);
このvalueOf
メソッドは、新しいオブジェクトを作成するか、以前に存在したオブジェクトへの参照を返す場合があります。(実際、JLSは、範囲 -128..+127 ... の数値valueOf
の値をキャッシュすることを保証します)Integer
対照的に、new Integer(20)
常に新しいオブジェクトを作成します。
. _ Integer
_ ==
1 つのケースとして、「20」の 2 つのインスタンスを比較する場合==
があります。true
それ以外の場合は、 であることが保証されますfalse
。
レッスン: を使用.equals(...)
して、ラッパー タイプを比較することはできません==
。
どちらを使用するかという問題について:
- の場合、最初の形式を使用します
i
。int
- である場合
i
はInteger
、2 番目の形式が最適です ...他のインスタンスに対するオブジェクトが必要でない限り。!=
ボックス化 (または明示的に を呼び出すvalueOf
) は、小さな値のオブジェクト割り当ての量を減らし、価値のある最適化です。