IndexOutOfBoundsException при добавлении в ArrayList по индексу

Я получаю исключение Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 для приведенного ниже кода. Но не мог понять, почему.

public class App {
    public static void main(String[] args) {
        ArrayList<String> s = new ArrayList<>();

        //Set index deliberately as 1 (not zero)
        s.add(1,"Elephant");

        System.out.println(s.size());                
    }
}

обновление

Я могу заставить его работать, но я пытаюсь понять концепции, поэтому я изменил объявление ниже, но тоже не работал.

ArrayList<String> s = new ArrayList<>(10)

9 ответов


индекс ArrayList начинается с 0 (ноль)

размер массива равен 0, и вы добавляете строковый элемент в 1-й индекс. Без добавления элемента в 0th index вы не можете добавить следующие позиции индекса. Что неверно.

Итак, просто сделайте это как

 s.add("Elephant");

или

s.add(0,"Elephant");

код ArrayList пусто. С этой строкой:

s.add(1,"Elephant");

вы пытаетесь добавить "Elephant" по индексу 1 на ArrayList (вторая позиция), которая не существует, поэтому он бросает!--6-->.

использовать

s.add("Elephant");

вместо.


вы должны добавлять элементы в ArrayList последовательно, начиная с 0, 1 и так далее.

Если вам нужно добавить элементы в определенную позицию, вы можете сделать следующее -

String[] strings = new String[5];
strings[1] = "Elephant";

List<String> s = Arrays.asList(strings);
System.out.println(s); 

это произведет выход sollowing

[null, Elephant, null, null, null]

Если вы действительно хотите "слон" в индексе 1, то вы можете добавить еще одну (например, нулевую) запись в индексе 0.

public class App {
public static void main(String[] args) {
    ArrayList<String> s = new ArrayList<>();

    s.add(null);
    s.add("Elephant");

    System.out.println(s.size());                
  }
}

или измените вызовы на .add для указания null в индексе 0 и elephant в индексе 1.


Для Android:

Если вам нужно использовать список, который будет иметь много пробелов лучше использовать SparseArray С точки зрения памяти (ArrayList будет много null записи).

пример использования:

SparseArray<String> list = new SparseArray<>();
list.put(99, "string1");
list.put(23, "string2");
list.put(45, "string3");
  • использовать list.append() если добавить последовательно клавиши, такие как 1, 2, 3, 5, 7, 11, 13...
  • использовать list.put() если вы добавляете непоследовательные ключи, такие как 100, 23, 45, 277, 42...

если ваш список будет иметь более сотни элементов, лучше использовать HashMap, так как поиск требует двоичного поиска, а добавление и удаление требуют вставки и удаления записей в массиве.


ArrayList не является саморасширяющимся. Чтобы добавить элемент в индекс 1, у вас должен быть элемент #0.


Не добавляйте индекс как 1 непосредственно в список Если вы хотите добавить значение в список добавить такой С. добавить("слон"); По умолчанию размер списка равен 0 Если вы добавите какие-либо элементы в список, размер будет увеличен автоматически вы не можете добавить непосредственно в список 1st index. //С. добавить(0, "слон");


add(int index, E element) API говорит, что ваш список массивов имеет нулевой размер, и вы добавляете элемент в 1-й индекс

Броски:

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

использовать boolean add(E e) вместо.

обновление на основе обновления вопроса

Я могу заставить его работать, но я пытаюсь понять концепции, поэтому я изменено объявление ниже, но тоже не работает.

ArrayList<String> s = new ArrayList<>(10)

когда вы звоните new ArrayList<Integer>(10), установив начальную емкость списка в 10, а не ее размер. Другими словами, при построении таким образом список массивов начинает свою жизнь пустой.


вы можете инициализировать размер (а не емкость) ArrayList следующим образом:

ArrayList<T> list = new ArrayList<T>(Arrays.asList(new T[size]));

в вашем случае:

ArrayList<String> s = new ArrayList<String>(Arrays.asList(new String[10]));

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