Вставить в любую позицию в java.util.List
В соответствии с документами вы можете вставлять объекты в любую позицию в списке:
Пользователь этого интерфейса имеет точный контроль над тем, где в списке вставлен каждый элемент.
(источник: http://download.oracle.com/javase/6/docs/api/java/util/List.html)
Но следующая программа не работает с исключением IndexOutOfBoundsException:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> myList = new ArrayList<String>();
myList.add(0, "derp");
myList.add(2, "herp");
for (String s : myList) {
System.out.println("Le string: " + s);
}
}
}
Это не помогает явно установить начальную емкость (что имеет смысл, поскольку значение по умолчанию равно 10).
Почему я не могу вставлять объекты в любую позицию, если его индекс меньше емкости? Является ли размер всегда равным количеству вставленных элементов?
Ответы
Ответ 1
Вы можете вставить объект в любое допустимое положение. Внимательно посмотрите на Javadoc для add(int, E)
:
Броски:
IndexOutOfBoundsException - если индекс находится за пределами диапазона (index < 0 || index > size())
Другими словами, вставка элемента всегда увеличивает размер списка на 1. Вы можете вставлять либо с конца, либо посередине... но вы не можете вставить его в конец.
Емкость ArrayList
является фактически деталью реализации - она контролирует, когда базовый массив должен быть заменен более крупным, чтобы справиться с большим количеством элементов. Размер списка - важная часть здесь - список с емкостью 100, но размер 5 по-прежнему остается только списком из 5 элементов, поэтому вставка в позицию 67 в такой список не имеет смысла.
Ответ 2
Емкость списка не совпадает с ее размером.
Емкость - это свойство списков с поддержкой массива (таких ArrayList
или Vector
), и это назначенный размер массива поддержки (то есть максимальное количество элементов, которые вы могли бы поставить перед необходимостью роста структура).
Размер, как вы говорите, - это количество элементов, присутствующих в списке.
Тогда почему бы вам не вставить элемент, где бы вы ни хотели, пока есть место для него? Простой, потому что интерфейс List
не указывает, как поддерживается объект, и вы не могли бы сделать его в чем-то вроде LinkedList
; поэтому однородное (и правильное) поведение заключается в том, чтобы генерировать исключение, когда это происходит.
Итак, у вас есть два варианта:
- Инициализируйте список правильно, добавив значения по умолчанию до желаемого размера.
- Если
null
является разумным значением по умолчанию для вас, вы можете использовать массив напрямую.
Ответ 3
ArrayList имеет два члена: емкость и размер
емкость - это длина базового массива, размер - длина массива, который ArrayList представляет
поэтому вам нужно добавить данные в список, чтобы сам ArrayList получил размер, в который вы хотите вставить данные
Ответ 4
Размер списка всегда равен числу вставленных элементов
Throws:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())
javadoc
Ответ 5
myList.add(2, "herp" ) должен быть myList.add(1, "herp" )
Как увеличивает размер списка на 1, а не 2.
Ответ 6
Сначала будет вставлен myList.add(0, "herp")
, после чего он будет проверять размер. Затем размер 1
, но вы вставляете в положение 2
.