Какова инициализация массива по умолчанию в 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
Бендж

Ответы:

281

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

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

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

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

Турбьерн Равн Андерсен
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Брэд Ларсон
Все, кроме локальных переменных, которые ни к чему не инициализированы, как скажет компилятор.
Маркиз Лорн
@ user207421, как указано в конце ответа.
Торбьерн Равн Андерсен
Это означает, что первое предложение вашего ответа не является правильным и должно быть изменено. А твой вопрос «откуда ты знаешь» в чате не имеет смысла. JLS говорит так, вот и все, и компилятор обеспечивает это, то же самое.
Маркиз Лорн
@ user207421 "явно не установлен на что-либо программистом" (что может потребоваться компилятору).
Торбьерн Равн Андерсен
60

Из спецификации языка 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.
Дейв Коста
источник
2
А как насчет массивов Long и Integer?
Георгий Добрев,
1
@GeorgyDobrev. Это ссылочные типы. Они будут нулевыми в соответствии со спецификацией выше.
Дейв Коста
Что насчет массива String?
Зак
1
@Zac, как и выше, String - это объект, поэтому значением по умолчанию в массиве будет null.
Дейв Коста,
18

JLS четко говорит

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

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

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

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

Аникет Тхакур
источник
1
Не отвечает на вопрос. Он спрашивает об инициализации по умолчанию.
Маркиз Лорн
3

По словам Ява,

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

байт - 0

короткая - 0

int - 0

длинный - 0л

плавать - 0.0f

двойной - 0.0d

char - '\ u0000'

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

булево - ложно

Абхишек Сингх
источник
2
Он не спрашивает о полях, он спрашивает о компонентах массива.
Маркиз Лорн
3
@EJP Можете ли вы уточнить, что означает компонент массива ???? Как правило, массив имеет некоторый тип данных (того же типа), который инициализируется, как указано выше, поэтому вы можете сказать мне, пожалуйста, среднее значение компонента ???
Абхишек Сингх
3

Торбьерн Равн Андерсен ответил за большинство типов данных. Так как была горячая дискуссия о массиве,

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

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

nantitv
источник
2

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

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

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

KKK
источник
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, а не как массив.
Торбьерн Равн Андерсен