ArrayList的初始大小

问题描述 投票:215回答:14

您可以通过执行设置ArrayList的初始大小

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

但是,你做不到

arr.add(5, 10);

因为它会导致越界异常。

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

add函数定义为add(int index, Object element)所以我没有添加到索引10。

java arraylist indexoutofboundsexception
14个回答
338
投票

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

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

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

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

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

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


1
投票

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

只需致电:

the disadvantage mentioned here

将Integer添加到ArrayList


1
投票

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


1
投票

如果你想在你的List上添加10个项目,你可以尝试:

0

如果您已经声明了一个数组大小变量,那么您将使用变量stream而不是数字'10'


1
投票

我遇到了类似的问题,只知道arrayList是List接口的可调整大小的数组实现,我也希望你可以添加元素到任何一点,但至少可以选择定义初始大小。无论如何,您可以先创建一个数组并将其转换为如下列表:

arr.add(10)

要么

ArrayList

0
投票

ArrayList myList = new ArrayList(10);

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

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


0
投票

我在size上的两分钱。我觉得最好用

  int index = 5;
  int size = 10;

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

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


93
投票

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

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

39
投票

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

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

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


19
投票

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

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

在列表中调用ArrayList时,set(index, element)与列表元素的实际数量(= size)(在代码中为零,因此抛出index)有关,而不是与数组长度(= capacity)(这是一个具体到AIOOBE的实现细节)。

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

编辑:你实际上使用LinkedList方法,而不是add(index, element),但原理在这里是相同的。


10
投票

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

set(index, element)

9
投票

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


6
投票

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

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


2
投票

这可能对某人有帮助 -

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

2
投票

迟到了,但在Java 8之后,我个人发现以下方法使用ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10])); API更简洁,可以替代Stream

例如,

the accepted answer

其中qazxsw poi是所需的qazxsw poi大小而没有qazxsw poi,Arrays.stream(new int[size]).boxed().collect(Collectors.toList())中的所有元素都被初始化为size

(我做了一个快速搜索,并没有在任何答案中看到List - 如果这个答案是多余的,我可以随时告诉我,我可以删除它)

© www.soinside.com 2019 - 2024. All rights reserved.