Почему Java разрешает массивы размером 0?


массивы в java фиксированы по длине. Почему Java разрешает массивы размером 0 тогда?

String[] strings = new String[0];
10 69

10 ответов:

Это означает, что он пуст. Т. е. вы можете зацикливаться на нем, как если бы он имел элементы и не имел результата:

for(int k = 0; k < strings.length; k++){
   // something
}

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

почему Java разрешает массивы размером 1? Разве это не довольно бесполезно, чтобы обернуть одно значение в массив? Разве не было бы достаточно, если бы Java разрешал только массивы размером 2 или больше?

Да, мы можем передать null вместо пустого массива и одного объекта или примитива вместо матрицы размера один.

но есть некоторые хорошие аргументы против такого ограничения. Мои личные главные аргументы:

ограничение слишком сложно и не очень необходимо

для ограничения размеров массивов [1..ЦЕЛОЕ ЧИСЛО.MAX_INT] мы должны добавить много дополнительных проверок boudary,(согласен с комментарием Konrads) перегрузка логики и метода преобразования в наш код. Исключение 0 (а может и 1) из допустимых размеров массива не экономит затрат, требует дополнительных усилий и негативно сказывается на производительности.

массив моделей вектор

массив-это хорошая модель данных для вектора (математика,не the Vector класс!). И конечно, вектор в математике может быть нулевым. Что концептуально отличается от несуществования.


Примечание - видной оболочкой для массива (char -) является String класса. Неизменное String материализует понятие пустого массива: это пустая строка ("").

иногда гораздо удобнее возвращать массив нулевого размера, чем null.

рассмотрим это (более подробное объяснение ответа полудня):

public String[] getStrings() {
 if( foo ) {
  return null;
 } else {
  return new String[] {"bar, "baz"};
 }
}

String[] strings = getStrings();
if (strings != null) {
 for (String s : strings) {
  blah(s);
 }
}

теперь сравните его с этим:

public String[] getStrings() {
 if( foo ) {
  return new String[0];
 } else {
  return new String[] {"bar, "baz"};
 }
}

// the if block is not necessary anymore
String[] strings = getStrings();
for (String s : strings) {
 blah(s);
}

Это (возвращая пустые массивы, а не нулевые значения), на самом деле является лучшей практикой в мире проектирования Java API.

Так же, как C++, он позволяет более чистой обработки, когда нет данных.

еще один случай, когда массив нулевой длины может быть полезен: Чтобы вернуть массив, содержащий все элементы в списке:

<T> T[ ] toArray(T[ ] a)

массив нулевой длины может быть использован для передачи типа массива в этот метод. Например:

ClassA[ ] result = list.toArray(new ClassA[0]);

массив нулевой длины по-прежнему является экземпляром объекта, который содержит нулевые элементы.

один случай, когда я могу думать о том, где пустой массив чрезвычайно полезен, - это использовать его вместо null в ситуации, когда null не допускается. Одним из возможных примеров этого является BlockingQueue массивов. Когда вы хотите, чтобы сигнализировать конец ввода на стороне чтения, что бы вы сделали? Отправить null кажется очевидным выбором, но дело в том, что BlockingQueue не принимает null. Вы можете обернуть свой массив внутри класса с помощью "boolean last; " вроде как поле, но это уже перебор. Отправка пустой (нулевого размера) массив кажется наиболее разумным выбором.

только Примечание:

вы говорите: "В отличие от C, где вы можете динамически увеличивать размер массива,.."но в C вы не можете изменить размер массива, то же для C++.

другой случай, когда массив нулевой длины полезен при копировании двумерного массива. Я могу написать:

public int[][] copyArray(int[][] array){
     int[][] newArray = new int[array.length][0];
     for(int i=0;i<array.length;i++){
         newArray[i] = array[i];
     }
     return newArray;

поскольку каждая ссылка на массив в массиве перезаписывается, инициализация их как ссылок на массивы нулевой длины является наиболее эффективной.

0-длина byte[] или char[] может представлять пустой String, который отличается от null. Получение байтов или символов в виде массивов из строк (с помощью getBytes(),getChars() на String класс и т. д.) и, наоборот, формирования StringС byte[],char[] Это довольно распространено. Например, для пользовательского кодирования, декодирования строк.