Начальная емкость ArrayList и исключение IndexOutOfBoundsException [дубликат]

На этот вопрос уже есть ответ здесь:

Рассмотрим этот пример кода:

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(7), что на самом деле происходит?

24
задан Community 23 May 2017 в 12:25
поделиться