ArrayList的初始大小

你可以通过做一个ArrayList来设置初始大小

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

但是,你不能这样做

 arr.add(5, 10); 

因为它会导致出界exception。

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

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

您将数组列表的大小与容量混淆在一起:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如果你想添加索引的元素,你可以改为使用数组。

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

10是AL的初始容量,而不是大小(这是0)。 当你要有很多元素的时候,你应该提到初始容量到一些很高的价值,因为它避免了在继续添加元素时扩展容量的开销。

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

在ArrayList上设置初始大小会减lessnr。 内部存储器重新分配的次数必须发生。 该列表由一个数组支持。 如果你指定ie的初始容量为0,已经在第一次插入元素时,内部数组将不得不被resize。 如果对于列表中可能包含的元素有一个大致的了解,设置初始容量将会减lessnr。 内存重新分配在您使用列表时发生。

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

只要打电话:

 arr.add(10) 

将整数添加到您的ArrayList

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

如果你想添加10个项目到你的ArrayList你可以尝试:

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

如果你已经声明了一个数组大小variables,你可以使用variablessize而不是数字“10”

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

/ *声明数组列表的初始意义不过是节省了内部转换时间; 当我们在内部添加元素时,它会检查capasity以增加capasity,您可以在0索引处添加元素,然后从1开始,依此类推。 * /