Java ArrayList的初始大小
您可以通过执行以下操作来设置ArrayList的初始大小Java ArrayList的初始大小,java,arraylist,indexoutofboundsexception,Java,Arraylist,Indexoutofboundsexception,您可以通过执行以下操作来设置ArrayList的初始大小 ArrayList<Integer> arr=new ArrayList<Integer>(10); 因为它会导致越界异常 如果无法访问分配的空间,设置初始大小有什么用 add函数被定义为add(int-index,Object-element),因此我不会添加到索引10。10是AL的初始容量,而不是大小(0)。当您将有很多元素时,您应该将初始容量提到某个较高的值,因为这样可以避免在不断添加元素时扩展容量的开销。
ArrayList<Integer> arr=new ArrayList<Integer>(10);
因为它会导致越界异常
如果无法访问分配的空间,设置初始大小有什么用
add函数被定义为
add(int-index,Object-element)
,因此我不会添加到索引10。10是AL的初始容量,而不是大小(0)。当您将有很多元素时,您应该将初始容量提到某个较高的值,因为这样可以避免在不断添加元素时扩展容量的开销。您将数组列表的大小与其容量混淆了:
- 大小是列表中元素的数量李>
- 容量是列表在不重新分配内部结构的情况下可以容纳的元素数量
newarraylist(10)
时,设置的是列表的初始容量,而不是其大小。换句话说,当以这种方式构造时,数组列表的生命开始为空
向数组列表中添加十个元素的一种方法是使用循环:
for (int i = 0; i < 10; i++) {
arr.add(0);
}
for(int i=0;i<10;i++){
arr.add(0);
}
完成此操作后,现在可以修改索引0..9处的元素。现在列表中没有元素,因此当列表不存在时,无法将其添加到列表的索引5中。您将列表的容量与其当前大小混淆 只要打电话:
arr.add(10)
将整数添加到数组列表中时,
数组列表的容量与其大小不同大小等于数组列表
(以及任何其他列表
实现)中包含的元素数
容量只是用于内部存储ArrayList
元素的基础数组的长度,并且始终大于或等于列表的大小
在列表上调用set(index,element)
时,index
与列表元素的实际数量(=大小)(在代码中为零,因此抛出AIOOBE
),而不是与数组长度(=容量)(这是特定于ArrayList
的实现细节)相关
set
方法对于所有List
实现都是通用的,例如LinkedList
,它实际上不是由数组实现的,而是作为一个链接的条目链实现的
编辑:您实际上使用的是添加(索引,元素)
方法,而不是设置(索引,元素)
,但这里的原则是相同的。我想您的问题的确切答案是:
在ArrayList上设置初始大小可以减少内部内存重新分配的次数。
该列表由一个数组支持。如果指定初始容量0,则在第一次插入元素时,必须调整内部阵列的大小。
如果您大致知道列表将容纳多少个元素,则设置初始容量将减少使用列表时发生的内存重新分配次数。虽然您的arraylist的容量为10,但实际列表中没有元素。add方法用于将元素插入到实际列表中。因为它没有元素,所以不能将元素插入到索引5中。如果需要具有预定义大小的列表,还可以使用:
List<Integer> arr = Arrays.asList(new Integer[10]);
List arr=Arrays.asList(新整数[10]);
如果要添加具有索引的元素,可以使用数组
String [] test = new String[length];
test[0] = "add";
如果您想在ArrayList
中添加10项,您可以尝试:
for (int i = 0; i < 10; i++)
arr.add(i);
for(int i=0;i<10;i++)
arr.add(i);
如果已声明数组大小变量,则将使用变量size
而不是数字“10”ArrayList myList=new ArrayList(10)
/*声明arraylist的初始功能只是在内部节省切换时间;当我们在内部添加元素时,它会检查容量以增加容量,您可以先在0索引处添加元素,然后在1索引处添加元素,以此类推*/ 如果您想使用集合。填充(列表,obj);为了用重复对象填充列表,您也可以使用
ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
arraylistarr=newarraylist(Collections.nCopies(10,0));
该行将10次0复制到您的ArrayList中这可能有助于某些人-
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
arraylistintegerarraylist=newarraylist(Arrays.asList(newinteger[10]);
我也遇到了类似的问题,只要知道arrayList是List接口的一个可调整大小的数组实现,我还希望您可以向任意点添加元素,但至少可以选择定义初始大小。
无论如何,您可以先创建一个数组,然后将其转换为如下列表:
int index = 5;
int size = 10;
Integer[] array = new Integer[size];
array[index] = value;
...
List<Integer> list = Arrays.asList(array);
int索引=5;
int size=10;
整数[]数组=新整数[大小];
数组[索引]=值;
...
列表=数组。asList(数组);
或
List List=Arrays.asList(新整数[size]);
list.set(索引、值);
做得太晚了,但是在Java8之后,我个人觉得下面的流
API方法更简洁,可以作为一种替代方法
比如说,
Arrays.stream(新的int[size]).boxed().collect(收集器.toList())
如果大小
是所需的列表
大小,而不包含该大小,则列表
中的所有元素都初始化为0
(我做了一个快速搜索,没有在发布的任何答案中看到流
——请随时告诉我这个答案是否多余,我可以删除它)我在流
上的两分钱。我觉得还是用这个比较好
IntStream.generate(i -> MyClass.contruct())
.limit(INT_SIZE)
.collect(Collectors.toList());
具有输入任何初始值的灵活性。contrib
List <Destination\> destinations = Collections.nCopies(source.size(), Destination.class.newInstance());
List destinations=Collections.nCopies(source.size(),D
List<Integer> list = Arrays.asList(new Integer[size]);
list.set(index, value);
IntStream.generate(i -> MyClass.contruct())
.limit(INT_SIZE)
.collect(Collectors.toList());
List <Destination\> destinations = Collections.nCopies(source.size(), Destination.class.newInstance());