ArrayList的初始大小

Cem*_*mre 234 java arraylist indexoutofboundsexception

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

ArrayList<Integer> arr=new ArrayList<Integer>(10);
Run Code Online (Sandbox Code Playgroud)

但是,你做不到

arr.add(5, 10);
Run Code Online (Sandbox Code Playgroud)

因为它会导致越界异常.

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

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

NPE*_*NPE 353

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

  • 大小是在列表中的元素的数目;
  • 容量是多少元素列表可以潜在地容纳而不重新分配其内部结构.

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

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

for (int i = 0; i < 10; i++) {
  arr.add(0);
}
Run Code Online (Sandbox Code Playgroud)

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

  • +1:较短的循环是`while(arr.size()<10)arr.add(0);`可能有用的是,大小至少需要为"10".例如,你可以使用`arr.set(9,n);` (48认同)
  • +1:很棒的回应,如果可以,我会给+10.从api中可以直接看出为什么你不能在单个构造函数调用中设置BOTH的初始大小和初始容量.你有点必须通读api并说"哦,我猜ArrayList没有方法或构造函数来做那个" (10认同)
  • +1提及尺寸和容量之间的差异 (4认同)

Ger*_*eld 96

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

List<Integer> arr = Arrays.asList(new Integer[10]);
Run Code Online (Sandbox Code Playgroud)

  • 这里略有不利,产生的`List`充满了空值.使用Guava,我们可以执行`Ints.asList(new int [10])`,它将使用`0`s初始化我们的列表.虽然清洁模式,谢谢你的例子. (11认同)
  • @dimo414,有时 null 比添加第三方库依赖项更好。 (3认同)
  • 此解决方案有一个变体:http://stackoverflow.com/a/36518805/363573 (2认同)
  • @Apostolos ArrayList是List接口的实现,而Arrays.asList返回ArrayList。我建议您查找多态性。 (2认同)

Far*_*Skt 41

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

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
Run Code Online (Sandbox Code Playgroud)

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


Nat*_*tix 19

容量ArrayList是不一样的大小.大小等于ArrayList(和任何其他List实现)中包含的元素数量.

容量是其用于存储internaly的元素的底层阵列的只是长度ArrayList,并且是始终大于或等于大小列表.

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

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

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


小智 10

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

    String [] test = new String[length];
    test[0] = "add";
Run Code Online (Sandbox Code Playgroud)

  • OP最初想要使用List ...而不是数组. (4认同)

Bhe*_*ung 9

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


qua*_*lar 6

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

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


H.T*_*Koo 6

迟到了,但是在Java 8 之后,我个人发现这种带有StreamAPI 的以下方法更简洁,并且可以替代已接受的答案

例如,

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

wheresize是所需的List大小,没有这里提到的缺点, 中的所有元素List都初始化为0.

(我进行了快速搜索,但没有看到stream任何已发布的答案 - 如果此答案是多余的,请随时告诉我,我可以将其删除)


Hri*_*dam 5

这可能会帮助某人 -

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
Run Code Online (Sandbox Code Playgroud)