Javaでの配列のデフォルトの初期化は何ですか?


144

だから私はint配列を宣言して初期化しています:

static final int UN = 0;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
    arr[i] = UN;
}

代わりにこれを行うとしましょう...

int[] arr = new int[5];
System.out.println(arr[0]);

... 0標準出力に出力されます。また、これを行うと:

static final int UN = 0;
int[] arr = new int[5];
System.out.println(arr[0]==UN);

... true標準出力に出力されます。では、Javaはデフォルトでどのように配列を初期化するのでしょうか?デフォルトの初期化が配列インデックスを設定していると想定しても安全0ですか?これは、配列をループして初期化する必要がないことを意味しますか?

ありがとう。


6
ただドキュメントを読んでください;)docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5
Benj

回答:


281

プログラマーによって明示的に何かに設定されていないJavaプログラムのすべては、ゼロ値に初期化されます。

  • ある参照(オブジェクトを保持しているもの)の場合null
  • int / short / byte / longの場合はです0
  • float / doubleの場合、 0.0
  • ブール値のためのものであることfalse
  • null文字であるchar '\u0000'(10進数の同等物は0)。

何かの配列を作成すると、すべてのエントリもゼロになります。したがって、配列は、によって作成された直後に5つのゼロを含みますnew

注(コメントに基づく):ローカル変数を割り当てるときにJava仮想マシンは基礎となるメモリをゼロにする必要がないため(これにより、必要に応じて効率的なスタック操作が可能になります)、ランダム値を回避するには、Java言語仕様でローカル変数を初期化する必要があります。


コメントは拡張ディスカッション用ではありません。この会話はチャットに移動さました
ブラッド・ラーソン

コンパイラーが指示するように、何にも初期化されないローカル変数を除くすべて。
ローン侯爵

回答の最後に記載されている@ user207421。
するThorbjörnRavnアンデルセン

つまり、回答の最初の文は正しくなく、修正する必要があります。そして、チャットでの「どうやって知っているか」という質問は意味がありません。JLSはそう言います、それだけです、そしてコンパイラはそれを強制します、同上。
ローン侯爵

@ user207421「プログラマーによって明示的に何かに設定されていない」(コンパイラーによって必要とされる場合があります)。
するThorbjörnRavnアンデルセン

60

Java言語仕様

  • 各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます(§15.9、§15.10)。

    • バイト型の場合、デフォルト値はゼロ、つまりの値です(byte)0
    • short型の場合、デフォルト値はゼロ、つまりの値です(short)0
    • タイプintの場合、デフォルト値はゼロ、つまりです0
    • long型の場合、デフォルト値はゼロ、つまりです0L
    • float型の場合、デフォルト値は正のゼロ、つまりです0.0f
    • タイプdoubleの場合、デフォルト値は正のゼロ、つまりです0.0d
    • char型の場合、デフォルト値はnull文字、つまりです'\u0000'
    • ブール型の場合、デフォルト値はfalseです。
    • すべての参照タイプ(4.3)のデフォルト値はnullです。

2
そして、Array of Long sとInteger sはどうですか?
Georgy Dobrev

1
@GeorgyDobrev。これらは参照型です。上記の仕様によれば、これらはnullになります。
Dave Costa

文字列配列はどうですか?
Zac

1
上記と同じ@Zac、文字列はオブジェクトなので、配列のデフォルト値はになりますnull
デイブ・コスタ

18

JLSははっきり言っています

配列初期化子は配列を作成し、そのすべてのコンポーネントの初期値を提供します。

これは、配列がインスタンス変数か、ローカル変数かクラス変数かには関係ありません。

プリミティブ型のデフォルト値:docs

オブジェクトのデフォルト値はnullです。


1
質問には答えません。彼はデフォルトの初期化について尋ねています。
ローン侯爵2014年

3

Javaによると、

データ型-デフォルト値

バイト-0

短い-0

int-0

長い-0L

浮動小数点-0.0f

ダブル-0.0d

char-'\ u0000'

文字列(または任意のオブジェクト)-null

ブール-false


2
彼はフィールドについて尋ねているのではなく、配列コンポーネントについて尋ねています。
ローン侯爵2014年

3
@EJPは、配列コンポーネントの意味を詳しく説明できますか???? 通常、配列には、上記のように初期化されるデータ型(同じ型)があるため、コンポーネントの平均を教えてください。
Abhishek Singh

3

ThorbjørnRavn Andersenがほとんどのデータ型について回答しました。アレイについて白熱した議論があったので、

jls仕様http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 「配列コンポーネントは、作成時にデフォルト値で初期化される」からの引用

配列がローカルであるかインスタンスであるかクラス変数であるかに関係なく、デフォルト値を使用すると思います


2

Javaのすべてのクラスにはコンストラクターがあります(コンストラクターは、クラス変数のフィールドを初期化する新しいオブジェクトが作成されるときに呼び出されるメソッドです)。したがって、クラスのインスタンスを作成すると、オブジェクトの作成中にコンストラクターメソッドが呼び出され、すべてのデータ値がその時点で初期化されます。

整数配列型のオブジェクトの場合、配列内のすべての値はコンストラクターメソッドで0(ゼロ)に初期化されます。同様にブール配列のオブジェクトの場合、すべての値はfalseに初期化されます。

したがって、Javaは、オブジェクトの作成中にコンストラクターメソッドを実行して配列を初期化しています


1

Javaでは、初期化時のJAVA配列のデフォルトの長さは10になると言っています。

private static final int DEFAULT_CAPACITY = 10;

ただし、size()メソッドは配列に挿入された要素の数を返します。初期化時に、配列に要素を挿入していない場合はゼロを返します。

private int size;

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

public void add(int index, E element) {
    rangeCheckForAdd(index);
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,size - index);
    elementData[index] = element;
    size++;
}

2
これは配列ではなく、ArrayListのように見えます。
するThorbjörnRavnアンデルセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.