Инициализация массива Java с нулевым размером

При объявлении массива в java мы должны динамически распределять память с помощью нового ключевого слова.

class array
{
  public static void main(String ars[]) { 
    int A[] = new int[10];
    System.out.println(A.length);
  }
}

Над кодом будет создан 1D массив, содержащий 10 элементов, по 4 байта каждый. и выход будет 10. Но когда вы запускаете такой же код, как показано ниже:

class array { 
  public static void main(String ars[]) {
    int A[] = new int[0];
    System.out.println(A.length);
  }
}

Результат равен 0. Я хочу знать, что когда вы пишете new int[0], тогда Java выделяет некоторую память для массива или нет? Если да, то сколько?

Ответ 1

Да, он выделяет некоторую память, но сумма варьируется в зависимости от реализации JVM. Вам нужно как-то представить:

  • Уникальный указатель (так что массив равен!= каждый другой новый int [0]), поэтому не менее 1 байт
  • Указатель класса (для Object.getClass())
  • Хэш-код (для System.identityHashCode)
  • Монитор объектов (для синхронизации (Object))
  • Длина массива

JVM может выполнять различные оптимизации (выводить системный хеш-код из указателя объекта, если он не был GC'ed/перемещен, использовать один бит для представления объекта, который никогда не был заблокирован, использовать один бит для представления пустой массив и т.д.), но он все равно должен выделить некоторую память.

Изменить: например, следуя инструкциям этого сообщения, моя JVM сообщает о размере 16 для new int[0] против 32 для new int[4].