最初のケースの初期化は、定数値の単純な割り当てです。興味深いことは何もありません...ただし、これは割り当てられているプリミティブ値であり、プリミティブ値には「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) は、小さな値のオブジェクト割り当ての量を減らし、価値のある最適化です。