不思議なんだけど、
プリミティブの配列を初期化するこれらの2つの方法の正確な違いは何ですか?
int[] arr1 = new int[]{3,2,5,4,1};
int[] arr2 = {3,2,5,4,1};
そしてどちらが好ましいですか?
何もありません、それらはまったく同じバイトコードを生成します。2番目の形式は古いバージョンのJavaではサポートされていなかった可能性があると思いますが、それはしばらく前のことです。
そういうわけで、それは個人的な好みの問題であるスタイルの問題になります。あなたが具体的に尋ねたので、私は2番目が好きですが、繰り返しますが、それは個人的な好みの問題です。
他の人が述べているように、それらは同等であり、2番目のオプションはそれほど冗長ではありません。残念ながら、コンパイラは2番目のオプションを常に理解できるとは限りません。
public int[] getNumbers() {
return {1, 2, 3}; //illegal start of expression
}
この場合、完全な構文を使用する必要があります。
public int[] getNumbers() {
return new int[]{1, 2, 3};
}
2つのステートメントに違いはありません。個人的には、2番目のものが好まれます。中括弧で指定されたすべての要素があるためです。コンパイラは、配列のサイズを計算するのに役立ちます。
したがってint[]
、代入演算子の後に追加する必要はありません。
あなたの場合、これらの2つのスタイルは同じ効果をもたらし、どちらも正しく、2番目のスタイルはより簡潔になります。しかし、実際にはこれら2つのスタイルは異なります。
Javaの配列は固定長のデータ構造であることを忘れないでください。配列を作成したら、長さを指定する必要があります。
初期化なしの場合、最初のケースは
int[] arr1 = new int[5];
2番目のケースは
int[] arr2 = {0,0,0,0,0};
違いがわかりますか?この状況では、これらのデフォルトの初期値をすべて手動で入力する必要がないため、最初のスタイルが推奨されます。
私にとって、2つのスタイルの唯一の大きな違いは、明示的な初期化なしで配列を作成する場合です。
この場合、2つ目は、よりきれいで冗長性が少ないためです:)
この状況で役立ちます
void foo(int[] array) {
}
リテラルで呼び出す
// works
foo(new int[]{5, 7})
//illegal
foo({5, 7})
@Paul Belloraの回答に加えて、三項演算子を使用してプリミティブ配列を初期化しようとしている場合は、2番目のオプションのみが機能します
int[] arr1 = false ? {} : {1,2}; // doesn't work
int[] arr2 = false ? new int[]{} : new int[]{1,2}; // works