Массивы в java имеют фиксированную длину. Почему тогда Java разрешает массивы размера 0?
String[] strings = new String[0];
Это означает, что он пуст. То есть вы можете перебрать его, как если бы он имел элементы и не получил никакого результата:
for(int k = 0; k < strings.length; k++){
// something
}
Тем самым избегая необходимости проверять. Если бы рассматриваемый массив был null
, возникло бы исключение, но в этом случае он просто ничего не делает, что может быть подходящим.
test(Object... objects)
явного вызова функции, когда функция естьtest()
Почему Java допускает использование массивов размером 1? Разве не бесполезно заключать одно значение в массив? Разве не было бы достаточно, если бы в Java разрешались только массивы размером 2 или больше?
Да, мы можем передать
null
вместо пустого массива и один объект или примитив вместо матрицы размера один.Но есть веские аргументы против такого ограничения. Мои личные главные аргументы:
Ограничение слишком сложно и не обязательно
Чтобы ограничить массивы размерами [1..INTEGER.MAX_INT], нам пришлось бы добавить
множество дополнительных проверок,(согласитесь с комментарием Конрадса) логики преобразования и перегрузок методов в наш код. Исключение 0 (и, возможно, 1) из разрешенных размеров массива не экономит затрат, требует дополнительных усилий и отрицательно сказывается на производительности.Вектор моделей массива
Массив является хорошей моделью данных для вектора (математик, а не
Vector
класс!). И, конечно же, вектор в математике может быть нулевым. Что концептуально отличается от несуществования.Sidenote - заметной оберткой для массива (char-) является
String
класс. НеизменяемыйString
материализует концепцию пустого массива: это пустая строка (""
).источник
>= 0
на> 0
). Но в остальном вы, конечно, правы, поэтому добавление этого ограничения не имело бы смысла.Иногда гораздо удобнее вернуть массив нулевого размера, чем нулевой.
источник
Подумайте об этом (более подробное объяснение ответа Полдня):
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.
Кроме того, в Java вы можете скрывать списки (например, ArrayList) в массивы, и имеет смысл преобразовывать только пустой список в пустой массив.
источник
Как и C ++, он позволяет более аккуратно обрабатывать данные при отсутствии данных.
источник
Другой случай, когда может быть полезен массив нулевой длины: чтобы вернуть массив, содержащий все элементы в списке:
Для передачи типа массива в этот метод можно использовать массив нулевой длины. Например:
ClassA[ ] result = list.toArray(new ClassA[0]);
Массив нулевой длины по-прежнему является экземпляром Object, который содержит нулевые элементы.
источник
Я могу придумать один случай, когда пустой массив чрезвычайно полезен, - это использовать его вместо null в ситуации, когда null не допускается. Одним из возможных примеров этого является BlockingQueue массивов. Что бы вы сделали, когда хотите сигнализировать об окончании ввода читающей стороне? Отправка null кажется очевидным выбором, но дело в том, что BlockingQueue не принимает нули. Вы могли бы обернуть свой массив внутри класса с
boolean last;
полем типа "", но это своего рода излишество. Отправка пустого (нулевого) массива кажется наиболее разумным выбором.источник
Другой случай, когда полезен массив нулевой длины, - это копирование двумерного массива. Я могу написать:
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
s изbyte[]
,char[]
является довольно распространенным явлением. Например, для нестандартной кодировки, декодирования строк.источник