Начальный размер для ArrayList

вы можете установить начальный размер для ArrayList, выполнив

ArrayList<Integer> arr=new ArrayList<Integer>(10);

однако, вы не можете сделать

arr.add(5, 10);

потому что это вызывает исключение за пределами.

какой смысл устанавливать начальный размер, если вы не можете получить доступ к выделенному вами пространству?

функция add определяется как add(int index, Object element) поэтому я не добавляю в индекс 10.

12 ответов


вы путаете размер списка массивов с его емкостью:

  • на в размере - количество элементов в списке;
  • на емкости - сколько элементов список потенциально может вместить без перераспределения его внутренних структур.

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

один из способов добавить десять элементов в список массива с помощью цикла:

for (int i = 0; i < 10; i++) {
  arr.add(0);
}

сделав это, теперь вы можете изменять элементы с индексами 0..9.


Если вы хотите список с предопределенным размером, вы также можете использовать:

List<Integer> arr = Arrays.asList(new Integer[10]);

Если вы хотите использовать коллекции.fill (list, obj); для заполнения списка повторяющимся объектом в качестве альтернативы вы можете использовать

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));

строка копирует 10 раз 0 в ваш ArrayList


емкости на ArrayList Это не то же самое, что его в размере. в размере равно количеству элементов, содержащихся в ArrayList (и любое другое List реализации).

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

при вызове set(index, element) на списка index относится к фактическому количеству элементов списка (=size) (который равен нулю в вашем коде, поэтому AIOOBE выбрасывается), а не к длине массива (=емкость) (которая является деталью реализации, специфичной для ArrayList).

на set способ является общим для всех List реализации, такие как LinkedList, который фактически не реализуется массивом, а как связанная цепочка записей.

редактировать: вы действительно используете add(index, element) метод, не set(index, element), но принцип здесь тот же.


Если вы хотите добавить элементы с индексом, вы можете вместо этого использовать массив.

    String [] test = new String[length];
    test[0] = "add";

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


Я думаю, что точный ответ на ваш вопрос будет такой:

установка начального размера в ArrayList уменьшает nr. время, когда должно произойти перераспределение внутренней памяти. Список поддерживается массивом. Если указать т. е. начальную емкость 0, то уже при первой вставке элемента внутренний массив должен быть изменен. Если у вас есть приблизительное представление о том, сколько элементов будет содержать ваш список, установка начальной емкости уменьшит nr. перераспределения памяти происходит, пока вы используете список.


сейчас в вашем списке нет элементов, поэтому вы не можете добавить в индекс 5 списка, когда он не существует. Вы путаете емкость списка с его текущим размером.

просто звоните:

arr.add(10)

чтобы добавить целое число в ArrayList


хотя ваш arraylist имеет емкость 10, реальный список здесь не имеет элементов. Метод Add используется для вставки элемента в реальный список. Поскольку он не имеет элементов, вы не можете вставить элемент с индексом 5.


Если вы хотите добавить 10 элементов в свой ArrayList вы можете попробовать это:

for (int i = 0; i < 10; i++)
    arr.add(i);

Если вы уже объявили переменную размера массива, вы должны использовать переменную size вместо числа '10'


Это может помочь кому-то -

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));

ArrayList myList = новый ArrayList(10);

//  myList.add(3, "DDD");
//  myList.add(9, "III");
    myList.add(0, "AAA");
    myList.add(1, "BBB");

    for(String item:myList){
        System.out.println("inside list : "+item);
    }

/*объявить начальную capasity arraylist-это не что иное, как экономия времени сдвига внутри; когда мы добавляем элемент внутри, он проверяет capasity, чтобы увеличить capasity, вы можете добавить элемент с индексом 0 изначально, а затем 1 и так далее. */