web-dev-qa-db-ja.com

プリミティブの配列を初期化します

不思議なんだけど、

プリミティブの配列を初期化するこれらの2つの方法の正確な違いは何ですか?

int[] arr1 = new int[]{3,2,5,4,1};

int[] arr2 = {3,2,5,4,1};

そしてどちらが好ましいですか?

24
Muz

何もありません、それらはまったく同じバイトコードを生成します。 2番目の形式が古いバージョンのJavaでサポートされていなかった可能性があると思いますが、それはしばらく前のことです。

そういうわけで、それは個人的な好みの問題であるスタイルの問題になります。あなたが具体的に尋ねたので、[〜#〜] i [〜#〜] 2番目を好むが、これも個人的な好みの問題。

15
T.J. Crowder

他の人が述べたように、それらは同等であり、2番目のオプションはそれほど冗長ではありません。残念ながら、コンパイラは2番目のオプションを常に理解できるとは限りません。

public int[] getNumbers() {
   return {1, 2, 3}; //illegal start of expression
}

この場合、完全な構文を使用する必要があります。

public int[] getNumbers() {
   return new int[]{1, 2, 3};
}
8
Paul Bellora

2つのステートメントに違いはありません。個人的には、2番目のものが好まれます。中括弧で指定されたすべての要素があるためです。コンパイラは、配列のサイズを計算するのに役立ちます。

したがって、代入演算子の後にint[]を追加する必要はありません。

7
whileone

あなたの場合、これらの2つのスタイルは同じ効果をもたらし、どちらも正しく、2番目のスタイルはより簡潔になります。しかし実際には、これら2つのスタイルは異なります。

Javaの配列は固定長のデータ構造であることに注意してください。配列を作成したら、長さを指定する必要があります。

初期化なしの場合、最初のケースは

int[] arr1 = new int[5];

2番目のケースは

int[] arr2 = {0,0,0,0,0};

違いがわかりますか?この状況では、これらのデフォルトの初期値をすべて手動で入力する必要がないため、最初のスタイルが推奨されます。

私にとって、2つのスタイルの唯一の大きな違いは、明示的な初期化なしで配列を作成する場合です。

4
David Chen

この状況で役立ちます

void foo(int[] array) {

}

リテラルで呼び出す

// works
foo(new int[]{5, 7})

//illegal
foo({5, 7})
1
goat

この場合、2つ目は、よりきれいで冗長性が少ないためです:)

1
Alex Lockwood