Що таке ініціалізація масиву на 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;) docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5
Benj

Відповіді:


281

Все в програмі Java, яка явно не встановлена ​​програмістом, ініціалізується на нульове значення.

  • Для довідок (все, що містить об’єкт), що є null.
  • Для int / short / byte / long, що є a 0.
  • Для float / double це а 0.0
  • Для булевих, що є false.
  • Для char - це нульовий символ '\u0000'(десятковий еквівалент - 0).

Коли ви створюєте масив чогось, усі записи також нульові. Отже, ваш масив містить п'ять нулів одразу після його створенняnew .

Примітка (на основі коментарів): Віртуальна машина Java не вимагає нульової базової пам'яті при розподілі локальних змінних (це дозволяє ефективні операції стека, якщо це необхідно), щоб уникнути випадкових значень Спеціалізація мови Java вимагає ініціалізації локальних змінних.


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Бред Ларсон

Все, крім локальних змінних, які не ініціалізовані ні до чого, як скаже вам компілятор.
Маркіз Лорн

@ user207421, як згадується в кінці відповіді.
Thorbjørn Ravn Andersen

Що означає, що перше речення вашої відповіді невірно і має бути змінено. І ваше питання "як ти знаєш" у чаті безглуздо. JLS говорять так, це все, і компілятор виконує це, ditto.
Маркіз Лорн

@ user207421 "програміст явно не встановлений на щось" (що може знадобитися компілятором).
Thorbjørn Ravn Andersen

60

З специфікації мови Java :

  • Кожна змінна клас, змінна інстанція або компонент масиву ініціалізуються зі значенням за замовчуванням, коли воно створюється (§15.9, §15.10):

    • Для байтів типу значення за замовчуванням дорівнює нулю, тобто значення (byte)0.
    • Для типу короткого значення за замовчуванням дорівнює нулю, тобто значення (short)0.
    • Для типу int значення за замовчуванням дорівнює нулю, тобто 0.
    • Для типу long, значення за замовчуванням дорівнює нулю, тобто 0L.
    • Для float типу значення за замовчуванням є додатним нулем, тобто 0.0f.
    • Для типу double - значення за замовчуванням - це додатний нуль, тобто 0.0d.
    • Для типу char типовим значенням є нульовий символ, тобто '\u0000'.
    • Для типу boolean значенням за замовчуванням є false.
    • Для всіх типів посилань (§4.3) значенням за замовчуванням є null.

2
А що з Array of Long s та Integer s?
Георгій Добрев

1
@GeorgyDobrev. Це еталонні типи. Вони будуть недійсними відповідно до вищезазначеної специфікації.
Дейв Коста

Що з масивом String?
Зак

1
@Zac, як і вище, String - це об'єкт, тому значенням за замовчуванням у масиві буде null.
Дейв Коста

18

JLS чітко говорить

Ініціалізатор масиву створює масив і надає початкові значення для всіх його компонентів.

і це незалежно від того, чи є масив змінною примірника, або локальною змінною, або змінною класу.

Значення за замовчуванням для примітивних типів: документи

Для об'єктів значеннями за замовчуванням є null.


1
Не відповідає на запитання. Він запитує про ініціалізацію за замовчуванням.
Маркіз Лорн

3

За словами java,

Тип даних - значення за замовчуванням

байт - 0

короткий - 0

int - 0

довгий - 0л

поплавок - 0,0f

подвійний - 0,0д

char - '\ u0000'

Рядок (або будь-який об'єкт) - null

булева - хибна


2
Він не запитує про поля, він запитує про компоненти масиву.
Маркіз Лорн

3
@EJP Ви можете, будь ласка, розробити, що означає серед компонентів масиву ???? як правило, у масиві є якийсь тип даних (того ж типу), який ініціалізується, як вище, так що ви можете, будь ласка, скажіть мені, значення компонента ???
Абхішек Сінгх

3

Thorbjørn Ravn Andersen відповідав на більшість типів даних. Оскільки була бурхлива дискусія про масив,

Цитування з http://ls.cd spec 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ørn Ravn Andersen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.