Рассмотрим этот пример кода:
List<String> myList = new ArrayList<String>(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:
Исключение в потоке "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 0
Я просмотрел этот вопрос о том, что означает "начальная емкость" в терминах ArrayList. Я понимаю, что этот конкретный конструктор выделяет место для 7 элементов String, и если мы попытаемся добавить в список 8 элементов, ему придется выделить больше места.
Я не понимаю, почему он не создает "пустой" список размером 7, с нулевыми значениями в каждом индексе, похожим на то, что произойдет, если мы объявим String[] myArray = new String[7]
. Я помню, как узнал, что ArrayList представляет собой реализацию Java динамического массива, поэтому я бы ожидал подобного рода поведения. Если у меня на самом деле нет места для 7 строк, выделенных при объявлении new ArrayList<String>(7)
, что на самом деле происходит?