2012-01-17 5 views
157

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

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

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

arr.add(5, 10); 

, потому что он вызывает аут исключения границ.

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

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

+4

Извините звучать грубо Сейчас: Но почему бы вам не читать API-Docs? ! http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html Я думаю, что он довольно хорошо объяснил это, вернусь с вопросами, если все еще есть некоторые из них :) – quaylar

+39

Собственно, его неясно из документов, что список должен содержать не менее * n * элементов, прежде чем вы сможете «установить/add' item * n-1 *. – Perception

+5

Восприятие: Я не знаю, очевидно ли это, но указано. Нужно внимательно прочитать JavaDoc.Throws: IndexOutOfBoundsException - если индекс за пределами диапазона (индекс <0 || index> = size()). – Natix

ответ

261

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

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

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

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

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

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

+34

+1: более короткий цикл - 'while (arr.size() <10) arr.add (0);' Полезно сказать, что размер должен быть как минимум '10'. например поэтому вы можете использовать 'arr.set (9, n);' –

+5

+1: Отличный ответ, я бы дал +10, если бы мог. Это не сразу видно из api, почему вы не можете установить BOTH начальный размер и начальную емкость в одном вызове конструктора. Вам нужно прочитать api и сказать: «О, я думаю, у ArrayList нет метода или конструктора для этого» – demongolem

+2

+1 для упоминания разницы между размером и емкостью –

7

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

1

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

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

arr.add(10) 

добавить Integer к вашему ArrayList

14

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

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

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

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

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

5

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

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

1

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

62

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

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

Вы создаете «Список » и присваиваете it to 'List ' –

+7

Небольшой недостаток здесь, в результате «List» заполнен нулями. С Guava мы можем сделать 'Ints.asList (новый int [10])', который инициализирует наш список '0' s. Чистый рисунок, хотя, спасибо за пример. – dimo414

+2

Это решение имеет вариант здесь: http://stackoverflow.com/a/36518805/363573 – Stephan

9

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

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

OP хотел использовать Список изначально ... не массив. – Stephan

1

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

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

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

0

ArrayList myList = new 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 и так далее. */

24

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

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

линейных копии 10 раза 0 в ваш ArrayList

Смежные вопросы