3

以下のように int を宣言することの違いは何ですか。異なるタイプの使用法に適したケースは何ですか

int i     = 20;
Integer i = 20;
Integer i = new Integer(20);

注意してください:ゴーグルしたところ、最初にプリミティブintを作成しようとしていることがわかりました.2番目に自動ボクシングを実行し、3番目にメモリ内に参照を作成します。

1 番目、2 番目、3 番目の種類の整数初期化をいつ使用する必要があるかを明確に説明するシナリオを探しています。使用法を交換するとパフォーマンスが低下しますか?

返信ありがとうございます。

4

3 に答える 3

6

最初のケースの初期化は、定数値の単純な割り当てです。興味深いことは何もありません...ただし、これは割り当てられているプリミティブ値であり、プリミティブ値には「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(...)して、ラッパー タイプを比較することはできません==


どちらを使用するかという問題について:

  • の場合、最初の形式を使用しますiint
  • である場合iInteger、2 番目の形式が最適です ...他のインスタンスに対するオブジェクトが必要でない限り。!=ボックス化 (または明示的に を呼び出すvalueOf) は、小さな値のオブジェクト割り当ての量を減らし、価値のある最適化です。
于 2013-04-18T04:36:03.833 に答える
3

代入なしで宣言された場合、プリミティブはデフォルト値を取ります。

ただし、ラッパー クラスは参照型であるため、代入がなければnull. これにより、NullPointerException代入なしで使用すると a がスローされる可能性があります。

于 2013-04-18T04:35:31.843 に答える
1

私が考えることができるそのようなシナリオの 1 つは、DB タイプを でマッピングする場合ですHibernate。Integer を使用する場合は、null をチェックできます (列にnull値が許可されていると仮定します)。プリミティブを使用し、データベースで値が null の場合、エラーがスローされると思います。

于 2013-04-18T04:33:32.273 に答える