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开始,依此类推。 * /