Каковы различные способы доступа к длине массива, коллекции (List
, Set
и т.д.) и объекта String
? Почему это другое?
Как я могу получить размер массива, коллекции или строки в Java?
Ответ 1
Сокращенный:
Для массива: используйте .length
.
Для Collection
(или Map
): используйте .size()
.
При a CharSequence
(который включает в себя CharBuffer
, Segment
, String
, StringBuffer
и StringBuilder
): используйте .length()
.
Массивы
Для доступа к нему можно использовать свойство .length
. Несмотря на то, что массив является динамически созданным Object
, мандат для свойства length
определяется Спецификация языка Java, §10.3:
Массив создается выражением создания массива (§15.10) или инициализатор массива (§10.6).
В выражении создания массива указан тип элемента, количество уровней вложенных массивов и длины массива, по меньшей мере, для одного уровней гнездования. Длина массива доступна как окончательная переменная экземпляра
length
.Инициализатор массива создает массив и предоставляет начальные значения для все его компоненты.
Поскольку длина массива не может измениться без создания нового экземпляра массива, повторный доступ .length
не изменит значение, независимо от того, что сделано для экземпляра массива (если только его ссылка заменяется массивом разного размера).
В качестве примера, чтобы получить длину объявленного одномерного массива, можно было бы написать это:
double[] testScores = new double[] {100.0, 97.3, 88.3, 79.9};
System.out.println(testScores.length); // prints 4
Чтобы получить длины в n-мерном массиве, нужно иметь в виду, что они обращаются к одному измерению массива за раз.
Здесь приведен пример двумерного массива.
int[][] matrix
= new int[][] {
{1, 2, 3, 4},
{-1, 2, -3, 4},
{1, -2, 3, -4}
};
System.out.println(matrix.length); // prints 3 (row length or the length of the array that holds the other arrays)
System.out.println(matrix[0].length); // prints 4 (column length or the length of the array at the index 0)
Это важно использовать, особенно в случае зубчатых массивов; столбцы или строки не всегда могут постоянно выстраиваться в линию.
Коллекции (Set
, List
и т.д.)
Для каждого объекта, реализующего интерфейс Collection
, они будут иметь метод size()
, с помощью которых можно получить доступ к общему размеру коллекции.
В отличие от массивов, коллекции не фиксированная длина, и могут добавлять или удалять элементы в любое время. Вызов size()
приведет к ненулевому результату тогда и только тогда, когда в самом списке было добавлено что-либо.
Пример:
List<String> shoppingList = new ArrayList<>();
shoppingList.add("Eggs");
System.out.println(shoppingList.size()); // prints 1
Некоторые коллекции могут отказаться от добавления элемента либо потому, что он null
, либо дубликат (в случае Set
). В этом случае повторные добавления к коллекции не будут увеличивать размер.
Пример:
Set<String> uniqueShoppingList = new HashSet<>();
uniqueShoppingList.add("Milk");
System.out.println(uniqueShoppingList.size()); // prints 1
uniqueShoppingList.add("Milk");
System.out.println(uniqueShoppingList.size()); // prints 1
Доступ к размеру List<List<Object>>
* выполняется аналогично массиву с неровностями:
List<List<Integer>> oddCollection = new ArrayList<>();
List<Integer> numbers = new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
}};
oddCollection.add(numbers);
System.out.println(oddCollection.size()); // prints 1
System.out.println(oddCollection.get(0).size()); // prints 3
*: Collection
не имеет метода get
, определенного в его интерфейсе.
В стороне, a Map
не является Collection
, но также имеет метод size()
. Это просто возвращает количество пар ключ-значение, содержащихся в Map
.
String
A String
имеет метод length()
. То, что он делает, это напечатать количество символов, присутствующих в этом экземпляре String
.
Пример:
System.out.println("alphabet".length()); // prints 8
Ответ 2
Не забывайте CollectionUtils.size()
из общедоступной библиотеки, его нулевой сейф, поэтому вам не нужно заранее проверять нуль.