Исходный размер для ArrayList

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

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

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

arr.add(5, 10);

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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

Опоздав на это, но после Java 8 я лично нахожу этот следующий подход с API Stream более лаконичным и может стать альтернативой принятому ответу.

Например,

Arrays.stream(new int[size]).boxed().collect(Collectors.toList())

где size - желаемый размер List, и без упомянутого здесь недостатка все элементы в List инициализируются как 0.

(Я сделал быстрый поиск и не увидел stream ни в одном опубликованном ответе - не стесняйтесь сообщить мне, является ли этот ответ излишним, и я могу удалить его)

Ответ 10

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

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

arr.add(10)

чтобы добавить Integer в ваш ArrayList

Ответ 11

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

Ответ 12

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

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

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

Ответ 13

Я сталкивался с подобной проблемой, и просто зная, что arrayList является реализацией изменяемого размера массива интерфейса List, я также ожидаю, что вы можете добавить элемент в любую точку, но, по крайней мере, иметь возможность определить начальный размер. В любом случае, вы можете сначала создать массив и преобразовать его в список, например:

  int index = 5;
  int size = 10;

  Integer[] array = new Integer[size];
  array[index] = value;
  ...
  List<Integer> list = Arrays.asList(array);

или

  List<Integer> list = Arrays.asList(new Integer[size]);
  list.set(index, value);

Ответ 14

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);
    }

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

Ответ 15

Мои два цента на Stream. Я думаю, что лучше использовать

IntStream.generate(i -> MyClass.contruct())
         .limit(INT_SIZE)
         .collect(Collectors.toList());

с гибкостью, чтобы поставить любые начальные значения.