13

コード 1:

ArrayList arr = new ArrayList();
arr.add(3);
arr.add("ss");

コード 2:

ArrayList<Object> arr = new ArrayList<Object>();
arr.add(3);
arr.add("ss");

コード 3:

ArrayList<Object> arr = new ArrayList<Object>();
arr.add(new Integer(3));
arr.add(new String("ss"));

上記の3つのコードはすべて正常に動作しています..どちらが優先され、その理由..および引数のタイプがArraylistに記載されていない場合にeclipseコンパイラが常に警告を発する理由..事前に感謝..

4

9 に答える 9

11

最初の簡単なルール:String(String)コンストラクターは絶対に使用しないでください。絶対に役に立たない(*)

だからarr.add("ss")大丈夫です。

3少し異なります:3はリテラルでintあり、オブジェクトではありません。オブジェクトのみをに入れることができますList。したがって、はオブジェクトintに変換する必要がありIntegerます。ほとんどの場合、それは自動的に行われます(このプロセスはオートボクシングと呼ばれます)。場合によっては、新しいインスタンスの作成を回避できる(そして回避する)のと同じことを効果的に実行します。Integer.valueOf(3)Integer

したがって、実際に書き込むことarr.add(3)、通常、を使用するよりも優れたアイデアですarr.add(new Integer(3))。これは、新しいオブジェクトの作成を回避し、代わりに既存のオブジェクトを再利用できるためです。Integer

免責事項:ここでは、2番目と3番目のコードブロックの違いに焦点を当てており、ジェネリックの部分はほとんど無視しています。ジェネリックの詳細については、他の回答を確認してください。

(*)それが役立ついくつかのあいまいなコーナーケースがありますが、それらに近づくと、絶対的なステートメントを絶対的なものとして決して受け取らないことがわかります;-)

于 2012-05-29T10:13:30.867 に答える
6

2番目のものが優先されます:

  • 不要/非効率的なコンストラクター呼び出しを回避します
  • リストの要素タイプを指定します(それが欠落している場合、警告が表示されます)

ただし、同じリストに 2 つの異なるタイプのオブジェクトがあると、デザインの臭いが少しします。それについて話すには、より多くの文脈が必要です。

于 2012-05-29T10:11:22.987 に答える
3

2番目の形式が推奨されます。

ArrayList<Object> arr = new ArrayList<Object>();
arr.add(3);
arr.add("ss");

ジェネリック型(などArrayList<T>)を使用する場合は、常にジェネリック引数を指定してください。これにより、最初のフォームが除外されます。

最後の形式に関しては、それはより冗長であり、利益のために余分な作業を行います。

于 2012-05-29T10:11:31.797 に答える
2

実際には、3分の1が優先されます。

ArrayList<Object> array = new ArrayList<Object>();
array.add(Integer.valueOf(3));
array.add("ss");

これにより、自動ボクシング(Integer.valueOf(3)3)が回避され、不要なStringオブジェクトが作成されません。

ArrayListのようなジェネリック型で型引数を使用しない場合、Eclipseは文句を言います。これは、raw型と呼ばれるものを使用しているためです。クラスがジェネリックである場合(つまり、型パラメーターがある場合)、そのクラスでは常に型引数を使用する必要があります。

一方、オートボクシングは個人的な好みです。大丈夫な人もいれば、そうでない人もいます。私はそれが好きではありません、そして私は自動ボクシング/自動アンボックスの警告をオンにします。

于 2012-05-29T10:13:59.883 に答える
2

最後の2つのバリアントは同じであり、必要な場所に自動的にintラップされます。<>にクラスを記述しない場合、デフォルトで記述されます。したがって、違いはありませんが、を書くと理解しやすくなります。IntegerObjectObjectObject

于 2012-05-29T10:16:46.757 に答える
2

上記を実行すると、配列リストに文字列と整数と象の両方を含めることができることを喜んで受け入れない限り、実行時エラーが発生する可能性があります。

Eclipse はエラーを返します。これは、ジェネリック パラメーターに型を指定しないと、実行時エラーが発生する可能性があるという事実をユーザーが認識しないようにするためです。少なくとも他の 2 つの例では、Arraylist にオブジェクトを含めることができ、Inetegers と String はどちらもオブジェクトであるため、Eclipse は警告を発しません。

コード 2 と 3 のどちらでもかまいません。しかし、配列リストにintのみまたは文字列のみがあることがわかっている場合は、そうします

ArrayList<Integer> arr = new ArrayList<Integer>();

また

ArrayList<String> arr = new ArrayList<String>();

それぞれ。

于 2012-05-29T10:11:19.700 に答える
2

ArrayListJavaジェネリックの一部であるため、警告が表示されます。基本的に、これはコンパイル時に型エラーをキャッチする方法です。たとえば、型 Integer ( ArrrayList<Integer>) で配列リストを宣言してからそれに文字列を追加しようとすると、コンパイル時にエラーが発生し、実行時の厄介なクラッシュを回避できます。

最初の構文は下位互換性のためにあり、可能な限り避ける必要があります (古いバージョンの Java にはジェネリックがなかったことに注意してください)。

2 番目と 3 番目の例はほとんど同じです。addメソッドにプリミティブ型ではなくオブジェクトを渡す必要があるため、3内部的に に変換されInteger(3)ます。文字列を二重引用符で囲むと、効果的にStringオブジェクトが作成されます。呼び出すと、値がパラメーター (「ss」) と同じでString("ss")ある新しいオブジェクトが作成されます。String

リストに異なる型を本当に保存する必要がない限り、適切な型宣言を実際に使用することをお勧めしArrayList<Integer> = new ArrayList<Integer>()ます。たとえば、長期的には頭痛の種を大幅に節約できます。

リストに複数のデータ型が必要な場合は、2 番目の例の方が適しています。

于 2012-05-29T10:16:31.750 に答える
0

最初に、arraylist コンストラクト内で保持およびリンクされる型を定義しません。

これが推奨される方法です。リストのタイプを定義すると、ide が残りを処理します。

3番目のものでは、より短いコードのリストを定義するだけでよいでしょう

于 2012-05-29T10:13:53.500 に答える