您可以通过以下方式设置ArrayList的初始大小
ArrayList<Integer> arr=new ArrayList<Integer>(10);
然而,你不能这样做
arr.add(5, 10);
因为这会导致数组越界异常。
如果你无法访问所分配的空间,那么设置初始大小有什么用呢?
add函数被定义为add(int index, Object element)
,所以我没有将元素添加到索引10。
您可以通过以下方式设置ArrayList的初始大小
ArrayList<Integer> arr=new ArrayList<Integer>(10);
然而,你不能这样做
arr.add(5, 10);
因为这会导致数组越界异常。
如果你无法访问所分配的空间,那么设置初始大小有什么用呢?
add函数被定义为add(int index, Object element)
,所以我没有将元素添加到索引10。
你误解了数组列表的大小和容量:
当你调用 new ArrayList<Integer>(10)
时,你设置的是列表的初始容量,而不是它的大小。换句话说,以这种方式构建的数组列表在创建时为空。
向数组列表添加十个元素的一种方法是使用循环:
for (int i = 0; i < 10; i++) {
arr.add(0);
}
完成此操作后,您现在可以修改索引为0..9的元素。
while(arr.size() < 10) arr.add(0);
它可以用来表达数组大小至少需要为10,这样你就可以使用arr.set(9, n);
。 - Peter Lawrey如果您想要一个预定义大小的列表,也可以使用以下方式:
List<Integer> arr = Arrays.asList(new Integer[10]);
Ints.asList(new int[10])
来初始化列表并填充0。不过这个模式很干净,感谢提供示例。 - dimo414ArrayList
是 List
接口的一种实现,而 Arrays.asList
返回的是一个 ArrayList
。我建议你查找一下多态性。 - Liam Potter如果你想使用Collections.fill(list, obj); 方法来用重复的对象填充列表,可以尝试以下方式:
ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
该行代码将10次将0复制到您的ArrayList中。
容量(Capacity)指的是 ArrayList
内部用于存储元素的底层数组的长度,与其 大小(size) 不同。 大小等于包含在 ArrayList
(以及任何其他 List
实现中)中的元素数量。
容量始终大于或等于列表的 大小,它只是用于实现 ArrayList
的底层数组的长度。
调用列表的 set(index, element)
方法时,index
是实际的列表元素数量(即 大小),而不是数组长度(即 容量,这是 ArrayList
特定的实现细节),因此在代码中使用了零索引而引发了 AIOOBE
异常。
set
方法是所有 List
实现都共有的方法,例如 LinkedList
并未像 ArrayList
一样使用数组实现,而是通过链接条目形成链表实现的。
编辑说明:实际上您使用的是 add(index, element)
方法,而非 set(index, element)
,但其原理在本例中是相同的。
String [] test = new String[length];
test[0] = "add";
10是AL的初始容量,而不是它的大小(大小为0)。如果您要添加很多元素,应该将初始容量设置为较高值,以避免在继续添加元素时扩展容量的开销。
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
我想对你的问题给出一个确切的答案:
在ArrayList上设置初始大小可以减少内部内存重新分配的次数。 该列表由数组支持。如果您指定了初始容量为0,那么在插入第一个元素时,内部数组就必须被重新调整大小。 如果您大概知道列表将保存多少个元素,那么设置初始容量将减少您使用列表时发生的内存重新分配次数。
我遇到了类似的问题,只知道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);
set/add
操作。 - PerceptionArrayList
。我个人希望有一种方法可以设置尺寸,这样我就可以在特定的索引位置放置东西。然而,这种方法似乎明显缺少。 - Andrew Wyldjava.util.Vector
有一个setSize(int)
方法,但是该类不幸地被同步化了,因此比ArrayList
慢。 - neuralmer