2016-03-29 8 views
2

私は私のように配列を宣言した場合に気づい:Javaで配列を初期化する必要はありますか?

int[] myarr = new int[10]; 

私が直接myarr[1] ++;myarr[1] = 1ように使用することができます。それはJavaで、我々はは、配列を初期化し、次の方法で0として各値を設定する必要はありませんことを意味ですか?

for (int i = 0; i < myarr.length; i++) { 
    myarr[i] = 0; 
} 

いくつかのコメントから、配列にはガベージ値が含まれている可能性があります。配列が整数配列の場合は、0以外のガベージが含まれますか?

+0

Javaで* anything *を初期化する必要がありますか? – Raedwald

答えて

10

Javaでは、すべての配列要素が自動的にデフォルト値に初期化されます。プリミティブな数値型の場合は、0または0.0です。ブール値の場合は、それはfalseです。オブジェクトの場合は、nullです。

C++などの他の言語では、初期化されていない配列の値は未定義です。コンパイラの中には、セキュリティのために同様に0/nullに初期化するものがありますが、これに頼ることは非常に悪い習慣です。ただし、この動作はJavaでよく定義されているため、プリミティブ配列を作成して値が0であることを信頼することはできます。

+0

+0

https://docs.oracle.com/javase/specs/を参照してください。 jls/se8/html/jls-15.html#jls-15.10.2 –

4

いいえ、すべてのJava配列は、適切な型のデフォルト値で埋められます

-3

いいえ、javaで配列を初期化する必要があります。自分のプログラムを書いていたときに配列を初期化せず、コンパイラ(jdk7)が私に与えましたエラー:

ArrayOne.java:4:変数myArrayが初期化されていない可能性があります。

このように私の編集に失敗しました。

+2

これは同じことではありません。つまり、コンポーネントではなく配列*変数*を初期化していないということです。配列以外の変数についても同じことが起こります。この要件は*確定割り当て*と呼ばれます。 –

+0

疑問がある場合は、[JLSセクション4.12.5](https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.5)に記載されています。 ):ローカル変数(14.4節、14.14節)は、初期化(14.4節)または代入(15.26節)のいずれかによって、使用前に明示的に値を与えなければなりません。 (§16(確定的割り当て))。 –

+0

参考にしていただきありがとうございます。 –

5

新たに初期化されたint[]は、言語仕様によってゼロで埋められます。

JLS §10.6 (Array Initializers)

を参照:

一次元アレイは、指定された長さで作成され、アレイの各成分は、そのデフォルト値(§4.12.5)に初期化されます。

§4.12.5を参照:

  • 各クラス変数、インスタンス変数、または配列成分(§15.10.2、15.9)が作成されたデフォルト値で初期化される。
    • バイトの場合、デフォルト値はゼロ、つまり(byte)0の値です。
    • short型の場合、デフォルト値はゼロ、つまり(short)0の値です。
    • int型の場合、デフォルト値は0、すなわち0です。
    • long型の場合、デフォルト値はゼロ、すなわち0Lです。
    • float型の場合、デフォルト値は正のゼロ、つまり0.0fです。
    • double型の場合、デフォルト値は正のゼロ、つまり0.0dです。
    • char型の場合、デフォルト値はヌル文字、つまり '\ u0000'です。
    • ブール型の場合、デフォルト値はfalseです。
    • すべての参照型(§4.3)では、デフォルト値はnullです。
0

あなたは配列初期化をスキップすることはできませんが、あなたは、配列の各要素を初期化する必要はありません。配列内の要素を初期化しないと、その特定の型のメンバ変数を初期化していない場合とまったく同じように動作します。Javaは型の既定値で初期化します。数値のプリミティブ型(int、 double、float ...)、falseブール値の場合は、オブジェクトの場合はnull(文字列が含まれます)。

関連する問題