312

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

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

但是,你不能这样做

arr.add(5, 10);

因为它会导致越界异常。

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

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

4

16 回答 16

452

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

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

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

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

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

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

于 2012-01-17T14:59:25.500 回答
141

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

List<Integer> arr = Arrays.asList(new Integer[10]);
于 2014-05-10T21:04:51.587 回答
63

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

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

该行将 10 乘以 0 复制到您的 ArrayList

于 2016-04-09T15:23:10.763 回答
23

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

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

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

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

编辑:您实际上使用的是add(index, element)方法,而不是set(index, element),但这里的原理是一样的。

于 2012-01-17T15:07:26.927 回答
10

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

    String [] test = new String[length];
    test[0] = "add";
于 2014-08-13T13:53:59.170 回答
9

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

于 2012-01-17T14:57:54.413 回答
6

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

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

于 2012-01-17T15:13:33.233 回答
6

这可能会帮助某人-

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
于 2018-06-14T08:38:41.137 回答
6

迟到了,但是在Java 8之后,我个人发现 API 的以下方法Stream更简洁,可以替代接受的答案

例如,

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

其中size是所需的List大小,并且没有此处提到的缺点, 中的所有元素List都初始化为0.

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

于 2019-02-26T05:05:08.930 回答
3

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

只需致电:

arr.add(10)

将整数添加到您的 ArrayList

于 2012-01-17T15:01:36.667 回答
3

我遇到了类似的问题,并且只知道 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);
于 2018-10-10T04:58:48.103 回答
1

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

于 2014-02-11T07:51:17.390 回答
1

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

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

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

于 2014-10-12T10:01:37.040 回答
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);
    }

/*Declare the initial capasity of arraylist is nothing but saving shifting time in internally; when we add the element internally it check the capasity to increase the capasity, you could add the element at 0 index initially then 1 and so on. */

于 2015-03-11T14:15:01.570 回答
0

贡献..

List <Destination\> destinations = Collections.nCopies(source.size(), Destination.class.newInstance());
于 2020-11-25T11:49:58.630 回答
0

我的两分钱Stream。我认为最好使用

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

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

于 2019-08-29T12:53:05.407 回答