Что такое инициализация по умолчанию для массива в Java? - PullRequest
131 голосов
/ 06 августа 2010

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

Спасибо.

Ответы [ 7 ]

256 голосов
/ 06 августа 2010

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

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

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

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

55 голосов
/ 06 августа 2010

Из спецификации языка 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.
17 голосов
/ 05 января 2014

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

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

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

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

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

3 голосов
/ 18 мая 2016

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

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

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

2 голосов
/ 19 июня 2015

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

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

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

2 голосов
/ 17 июня 2015

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 голосов
/ 21 января 2014

Согласно Java,

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

байт - 0

short - 0

int - 0

long - 0L

float - 0.0f

double - 0.0d

char - '\ u0000'

String (или любой объект) - null

логический - false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...