64

forループで使用するサイズをキャプチャするために整数変数を使用するクラスに出くわしました。これは良い習慣ですか、それとも int プリミティブ データ型を使用する必要がありますか?

Integer size = something.getFields().size();
for (Integer j = 0; j < size - 1; ++j) 
4

9 に答える 9

98

Integer クラスが提供されているため、純粋なオブジェクト指向の方法で値をボックス化/ボックス化解除できます。オブジェクト指向の方法で特に使用する必要がない限り、必要に応じて int を使用します。この場合、Integer が適切です。

Java Int 対 Integer

ただし、ここでは非常に異なることがカバーの下で進行しています。int は数値です。an > Integer は、数値を含むオブジェクトを参照できるポインターです。

...

int はオブジェクトではないため、オブジェクトを必要とするメソッドに渡すことはできません。一般的なケースは、提供されているコレクション クラス ( List 、 Map 、 Set ) を使用する場合です。ただし、オブジェクト バージョンと同様の機能を提供するこれらのクラスのバージョンを作成することは可能です。ラッパー クラス ( Integer 、 Double など) は、(リフレクション API などで) イントロスペクションが使用されるたびに頻繁に必要になります。

どちらを使用するか、もう一方を使用するかについてのより良い説明:

int と Integer の選択

理由を詳しく説明する前に、これらの型をどのように使用するかから始めます。

  • intパフォーマンス上の理由で優先
  • オブジェクトを取るメソッド ( のようなジェネリック型を含むList<T>) では、暗黙的に Integer を使用する必要があります。
  • 値が小さい場合 (-128 から 127) の使用Integerは、interning のため比較的安価です - Integer.valueOf(int)new Integer(int) ではなく使用します
  • ==or!=を整数型と一緒に使用しないでください
  • Integer値の不在 (null) を表す必要がある場合は、使用を検討してください。
  • 整数値を null 値を持つ int にボックス化解除することに注意してください
于 2012-05-16T17:38:58.660 に答える
42

使えるintならそうしましょう。null値がジェネリックなどのオブジェクトとして使用できる、または使用されている場合は、次を使用します。Integer

通常、どちらを使用しても問題ありませんが、多くの場合int、わずかに優れたパフォーマンスを発揮します。

于 2012-05-16T17:36:47.983 に答える
17

このアプローチは実際には適切ではありませんint。可能な限り使用してください。の使用Integerは、この特定の変数が可能であることを示しますnull(または、コレクション内にあった、いまいましいジェネリック...) - そうではありません。

また、使用Integerすると、ボックス化とボックス化解除の余分なオーバーヘッドが発生します。

于 2012-05-16T17:37:03.813 に答える
5

これは、大規模なプロジェクトで発生する可能性のある災害です。ここでのコーダーは、各 Integer が実際には新しいオブジェクトであり、それを int として使用するには、常にボックス化とボックス化解除が必要であることを忘れていました。非効率であるだけでなく、期待どおりに動作しません。可能な場合は常に int を使用し、これらの値をリスト、コンテナー、またはデータベース ストレージに配置する場合にのみ Integer を使用することをお勧めします。>、<、および == を使用してオブジェクトを比較することは、同じ演算子を使用してプリミティブを比較する場合とは異なることを意味することに注意してください。

于 2012-05-16T17:38:24.337 に答える
1

オブジェクトを使用する必要がある場合は、Integer、Double、FloatなどのWrapperクラスを使用する必要があります...

例えば:

 int n = Integer.parseInt("10");

ここでは、文字列を整数(プリミティブ型)に変換していますが、メソッドparseInt(String str)はラッパークラス(つまりObject)でのみ機能するため、これを使用しました...Javaでさらに多くの用途があります。

于 2012-05-16T17:40:10.830 に答える
1

プリミティブ型と参照型の間の変換のオーバーヘッドが発生するため、ボックス化とボックス化解除によってパフォーマンスが低下する可能性があります。

ただし、Integerクラスは、非常に便利なメソッドを追加します。

于 2012-05-16T17:41:51.210 に答える
1

可能な場合は常にプリミティブ型をプロモートします。

プリミティブ型は、GenericArgument または null として使用できません。

于 2012-05-16T17:36:54.530 に答える
1

ループするためだけに使用しないでください。Class Integer と同じではないプリミティブ型 int (より良いパフォーマンス) を使用します。

Integer クラスは、プリミティブ型 int の値をオブジェクトにラップします。Integer 型のオブジェクトには、int 型のフィールドが 1 つ含まれています。

さらに、このクラスは、int を String に、String を int に変換するためのいくつかのメソッド、および int を処理するときに役立つその他の定数とメソッドを提供します。

したがって、整数関数を呼び出す必要がある場合、またはそれに null 値を割り当てる必要がある場合は、Integer を使用してください。

List のようなジェネリックには、int の代わりに Integer を使用する必要もあります。

于 2012-05-16T17:38:54.060 に答える
0

純粋にオブジェクト指向であるため、通常は整数を使用します。int のパフォーマンスは、対応するオブジェクトよりもはるかに優れていますが、ループ内で何百万回もループしている場合にのみ顕著です。

IMHO、アプリケーションでパフォーマンスが最も重要であり、1ナノ秒でも圧縮したい場合は、頭を使わずに int を使用してください。ただし、オブジェクト指向と可読性が主な関心事である場合は、整数を使用してください。

于 2015-05-17T08:38:07.447 に答える