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).