Вставить в любую позицию в 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.