На этот вопрос уже есть ответ здесь:
Рассмотрим этот пример кода:
List myList = new ArrayList(7);
myList.add(5, "Hello");
myList.removeAll(Collections.singleton(null));
System.out.println(myList.size() + " objects:" );
for (String s : myList) {
System.out.println("\t" + s);
}
myList
инициализируется с начальной емкостью 7, затем следующая строка пытается добавить строку «Hello» в позицию 5. Это вызывает исключение IndexOutOfBoundsException :
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 0
. Я просмотрел этот вопрос о том, что означает «начальная емкость» с точки зрения ArrayList. Я понимаю, что этот конкретный конструктор выделяет место для 7 элементов String,и если мы попытаемся добавить в список 8 элементов, ему придется выделить больше места.
Чего я не понимаю, так это того, почему он не создает "пустой" список размером 7 с нулевыми значениями в каждом индексе, подобно тому, что произошло бы, если бы мы объявили String[] myArray = new String[7]
. Я помню, как узнал, что ArrayList — это реализация динамического массива в Java, поэтому я ожидал подобного поведения. Если у меня на самом деле нет места для 7 строк, когда я объявляю new ArrayList
, что на самом деле происходит?