数组列表的初始大小

你可以通过下面的操作来设置数组列表的初始大小

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

然而,你不能这样做

arr.add(5, 10);

因为它会导致出界异常。

如果不能访问所分配的空间,那么设置初始大小有什么用呢?

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

598636 次浏览

10是AL的初始容量,而不是size (size是0)。当你要有很多元素时,你应该把初始容量提到一个较高的值,因为它避免了在不断添加元素时扩展容量的开销。

你混淆了数组列表的大小和容量:

  • 大小是列表中元素的个数;
  • 能力是在不重新分配其内部结构的情况下列表可以容纳的元素数量。

当你调用new ArrayList<Integer>(10)时,你是在设置列表的初始能力,而不是它的大小。换句话说,当以这种方式构造数组列表时,数组列表开始时为空。

向数组列表中添加10个元素的一种方法是使用循环:

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

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

现在你的列表中没有元素,所以当索引5不存在时,你不能添加到它。您混淆了列表的容量与其当前大小。

就叫:

arr.add(10)

将整数添加到数组列表中

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

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

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

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

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

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

在ArrayList上设置初始大小可以减少内部内存重新分配的次数。 该列表由一个数组支持。如果你指定初始容量为0,在第一次插入一个元素时,内部数组就必须重新调整大小。 如果你有一个大概的想法,你的列表将容纳多少元素,设置初始容量将减少发生内存重新分配当你使用列表

尽管你的数组列表的容量是10,但实际的数组中没有元素。add方法用于将元素插入到实际列表中。因为它没有元素,所以不能在索引5中插入一个元素。

如果你想要一个预定义大小的列表,你也可以使用:

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

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

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

如果你想在ArrayList中添加10个元素,你可以这样做:

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

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

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);
}

/*在内部声明数组列表的初始容量只是为了节省移位时间;当我们在内部添加元素时,它会检查容量以增加容量,你可以先添加索引为0的元素,然后再添加索引为1的元素,等等。* /

如果你想使用集合。填充(列表,obj);为了用重复的对象填充列表,您可以使用

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

这一行将10乘以0复制到数组列表中

这可能会帮助到一些人

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
我也遇到过类似的问题,只是知道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);

虽然在这方面做得比较晚,但在Java 8之后,我个人认为下面这种使用Stream API的方法更简洁,可以替代公认的答案

例如,

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

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

(我做了一个快速搜索,没有看到stream在任何答案张贴-请让我知道这个答案是多余的,我可以删除它)

我对Stream的看法。我觉得还是用它比较好

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

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

普通发布版. .

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