Какова инициализация по умолчанию массива в 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, что означает, что мне не нужно перебирать массив и инициализировать его?

Спасибо.

Ответ 1

Все в программе Java, явно не установленное программистом, инициализируется нулевым значением.

  • Для ссылок (что-нибудь, что содержит объект), который является null.
  • Для int/short/byte/long это 0.
  • Для float/double это 0.0
  • Для логических значений это false.
  • Для символа char это нулевой символ '\u0000' (десятичный эквивалент которого равен 0).

Когда вы создаете массив чего-либо, все записи также обнуляются. Таким образом, ваш массив содержит пять нулей сразу после того, как он создан new.

Примечание (на основе комментариев): Виртуальная машина Java не обязана обнулять базовую память при выделении локальных переменных (это позволяет при необходимости выполнять эффективные операции со стеком), поэтому во избежание случайных значений Спецификация языка Java требует инициализации локальных переменных.

Ответ 2

Из Спецификация языка Java:

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

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

Ответ 3

JLS ясно говорит

Инициализатор массива создает массив и предоставляет начальные значения для всех его компонентов.

и это независимо от того, является ли массив переменной экземпляра или локальной переменной или переменной класса.

Значения по умолчанию для примитивных типов: docs

Для объектов по умолчанию значения null.

Ответ 4

Thorbjørn Ravn Andersen ответил на большинство типов данных. Поскольку в массиве было горячее обсуждение,

Цитата из jls spec http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "компонент массива инициализируется значением по умолчанию при его создании"

Я думаю, что независимо от того, является ли массив локальной или переменной экземпляра или класса, он будет со значениями по умолчанию

Ответ 5

Согласно java,

Тип данных - значения по умолчанию

byte - 0

short - 0

int - 0

long - 0L

float - 0.0f

double - 0.0d

char - '\ u0000'

Строка (или любой объект) - null

boolean - false

Ответ 6

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++;
}

Ответ 7

У каждого класса в Java есть конструктор (конструктор - это метод, который вызывается при создании нового объекта, который инициализирует поля переменных класса). Поэтому, когда вы создаете экземпляр класса, при создании объекта вызывается метод конструктора, и все значения данных инициализируются в это время.

Для объекта целочисленного типа массива все значения в массиве инициализируются в 0 (ноль) в методе конструктора. Аналогично для объекта логического массива все значения инициализируются как false.

Таким образом, Java инициализирует массив, выполняя метод конструктора при создании объекта.