Вставить в любой позиции в java.util.List - PullRequest
19 голосов
/ 21 октября 2011

В соответствии с документами вы можете вставлять объекты на любую позицию в списке:

Пользователь этого интерфейса имеет точный контроль над тем, где в списке каждый элемент вставлен.

(источник: 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).

Почему я не могу вставлять объекты в любую позицию, если их индекс меньше емкости? Всегда ли размер равен количеству вставленных элементов?

Ответы [ 6 ]

26 голосов
/ 21 октября 2011

Вы можете вставить объект в любую действительную позицию.Внимательно посмотрите на Javadoc для add(int, E):

Броски:
IndexOutOfBoundsException - если индекс находится вне диапазона (index < 0 || index > size())

Другими словами, вставка элемента всегда увеличивает размер списка на 1. Вы можете вставить любой конец или в середину ... но вы не можете вставить past конец.

Емкость ArrayList фактически является деталью реализации - она ​​контролирует, когда массив резервных копий необходимо заменить на более крупный, чтобы справиться с большим количеством элементов.,Важной частью здесь является размер списка - список с емкостью 100, но размер 5 - это всего лишь список из 5 элементов, и поэтому вставка позиции 67 в такой список не имеет смысла.

2 голосов
/ 21 октября 2011

Объем списка не совпадает с его размером.

Емкость - это свойство списков на основе массива (например, ArrayList или Vector), и это выделенный размер массива резервных копий (т. Е. Максимальное количество элементов, которое вы можете поместить до того, как вам понадобится расти). структура).

Размер, как вы говорите, это количество элементов, присутствующих в списке.

Тогда, почему вы не сможете вставить элемент туда, куда хотите, если есть место для него? Все просто, потому что интерфейс List не определяет способ резервного копирования объекта, и вы не можете сделать это в чем-то вроде LinkedList; таким образом, однородное (и правильное) поведение заключается в создании исключения, когда это происходит.

Итак, у вас есть два варианта:

  • Правильно инициализируйте список, добавив значения по умолчанию до желаемого размера.
  • Если null является разумным значением по умолчанию для вас, вы можете использовать массив напрямую.
1 голос
/ 21 октября 2011

myList.add (2, "herp") должен быть myList.add (1, "herp")

При увеличении размера List увеличивается на 1, а не 2.

0 голосов
/ 21 октября 2011

Сначала будет вставлено myList.add(0, "herp"), затем будет проверен размер. Тогда размер 1, но вы вставляете в позицию 2.

0 голосов
/ 21 октября 2011

Размер списка всегда равен количеству вставленных элементов

Throws:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

Javadoc

0 голосов
/ 21 октября 2011

ArrayList имеет два члена: емкость и размер

емкость - длина базового массива, размер - длина массива, который ArrayList представляет

, поэтому необходимо добавить данные всписок, так что сам ArrayList получает размер, в который вы хотите вставить данные

...