ArrayList的初始大小

时间:2012-01-17 14:56:01

标签: java arraylist indexoutofboundsexception

您可以通过

设置ArrayList的初始大小
ArrayList<Integer> arr=new ArrayList<Integer>(10);

然而,你做不到

arr.add(5, 10);

因为它会导致越界异常。

如果您无法访问分配的空间,设置初始大小有什么用?

add函数定义为add(int index, Object element),因此我不会添加到索引10。

16 个答案:

答案 0 :(得分:330)

您将数组列表的大小与其容量混淆:

  • 尺寸是列表中元素的数量;
  • 容量是列表可以容纳的元素数量,而无需重新分配其内部结构。

当您致电new ArrayList<Integer>(10)时,您正在设置列表的初始容量,而不是其大小。换句话说,当以这种方式构造时,数组列表的生命空白。

将十个元素添加到数组列表的一种方法是使用循环:

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

完成此操作后,您现在可以修改索引0..9。

中的元素

答案 1 :(得分:89)

如果您想要一个具有预定义大小的列表,您还可以使用:

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

答案 2 :(得分:39)

如果你想使用Collections.fill(list,obj);为了用重复的对象填充列表,你可以使用

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

该行将10次0复制到您的ArrayList

答案 3 :(得分:18)

ArrayList

容量尺寸不同。 大小等于ArrayList(以及任何其他List实施中包含的元素数量。)

容量只是底层数组的长度,用于内部存储ArrayList的元素,并且总是大于或等于大小

在列表中调用set(index, element)时,index与列表元素的实际数量(=大小)相关(在代码中为零,因此抛出AIOOBE ),而不是数组长度(=容量)(这是ArrayList特定的实现细节)。

set方法对于所有List实现都是通用的,例如LinkedList,它实际上不是由数组实现的,而是作为链接的条目链。

修改:您实际使用的是add(index, element)方法,而不是set(index, element),但此处的原则相同。

答案 4 :(得分:10)

如果要添加带索引的元素,可以使用数组。

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

答案 5 :(得分:9)

10是AL的初始容量,而不是大小(为0)。当你想要拥有大量元素时,你应该提到一些高值的初始容量,因为它可以避免在你不断添加元素时扩展容量的开销。

答案 6 :(得分:6)

我想你问题的确切答案是:

在ArrayList上设置初始大小会减少nr。内部存储器重新分配必须发生的时间。 该列表由数组支持。如果指定初始容量为0,则在第一次插入元素时,必须调整内部数组的大小。 如果您大致了解列表将包含多少元素,则设置初始容量将减少nr。使用列表时发生的内存重新分配。

答案 7 :(得分:1)

现在列表中没有元素,因此当它不存在时,您无法添加到列表的索引5。您将列表的容量与其当前大小混淆。

请致电:

arr.add(10)

将Integer添加到ArrayList

答案 8 :(得分:1)

虽然您的arraylist的容量为10,但真实列表中没有元素。 add方法用于将元素插入到真实列表中。由于它没有元素,因此不能将元素插入索引5。

答案 9 :(得分:1)

如果您想向ArrayList添加10个项目,可以尝试:

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

如果您已经声明了数组大小变量,那么您将使用变量size而不是数字&#39; 10&#39;

答案 10 :(得分:1)

这可能有助于某人 -

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

答案 11 :(得分:1)

这很晚,但是在 Java 8 之后,我个人发现使用Stream API的以下方法更为简洁,可以替代the accepted answer

例如,

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

其中size是所需的List大小,如果没有the disadvantage mentioned here,则List中的所有元素都将初始化为0

(我进行了快速搜索,但在发布的任何答案中都没有看到stream-请随时让我知道此答案是否多余,我可以将其删除)

答案 12 :(得分: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);
    }

/ *宣告arraylist的初始能力只不过是在内部节省转移时间;当我们在内部添加元素时,检查capasity以增加capasity,你可以将元素添加到0 index,然后是1,依此类推。 * /

答案 13 :(得分:0)

我遇到了类似的问题,仅知道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 :(得分:0)

我在Stream上的2分钱。我认为最好使用

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

可以灵活地放置任何初始值。

答案 15 :(得分:0)

贡献..

List <Destination\> destinations = Collections.nCopies(source.size(), Destination.class.newInstance());