web-dev-qa-db-ja.com

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

だから私は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に設定していると想定しても安全ですか?これは、配列をループして初期化する必要がないことを意味しますか?

ありがとう。

130
Hristo

Java言語仕様 から:

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

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

JLS 明確に言う

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

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

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

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

17
Aniket Thakur

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

Jls仕様から引用 http://docs.Oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "配列コンポーネントは、作成時のデフォルト値」

配列がローカルであるか、インスタンスまたはクラス変数であるかに関係なく、デフォルト値で

3
nantitv

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
RAJIV GUPTA

Javaによると、

データ型-デフォルト値

バイト-0

ショート-0

int-0

長い-0L

フロート-0.0f

ダブル-0.0d

char-'\ u0000'

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

ブール-false

2
Abhishek Singh

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

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

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

2
kkk