提问人:Cemre Mengü 提问时间:1/17/2012 最后编辑:NullCemre Mengü 更新时间:10/6/2023 访问量:655854
ArrayList 的初始大小
Initial size for the ArrayList
问:
您可以通过执行以下操作来设置 ArrayList 的初始大小
ArrayList<Integer> arr=new ArrayList<Integer>(10);
但是,你不能这样做
arr.add(5, 10);
因为它会导致越界异常。
如果您无法访问您分配的空间,设置初始大小有什么用?
add 函数定义为,所以我不会添加到索引 10。add(int index, Object element)
答:
10 是 AL 的初始容量,而不是大小(即 0)。当您要拥有大量元素时,您应该将初始容量提及到某个高值,因为它避免了在不断添加元素时扩展容量的开销。
您混淆了数组列表的大小及其容量:
- size 是列表中的元素数;
- 容量是指列表在不重新分配其内部结构的情况下可以容纳多少元素。
调用时,您设置的是列表的初始容量,而不是其大小。换句话说,当以这种方式构造时,数组列表的生命周期开始为空。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);
目前,列表中没有元素,因此当列表不存在时,无法将其添加到索引 5。您混淆了列表的容量及其当前大小。
只需致电:
arr.add(10)
将 Integer 添加到 ArrayList 中
的容量与其大小不同。Size 等于 (和任何其他实现) 中包含的元素数。ArrayList
ArrayList
List
容量只是底层数组的长度,用于在内部存储 的元素,并且始终大于或等于列表的大小。ArrayList
调用列表时,与列表元素的实际数量 (=size) 相关(在代码中为零,因此会抛出 ),而不是与数组长度 (=capacity) 相关(这是特定于 的实现细节)。set(index, element)
index
AIOOBE
ArrayList
该方法对于所有实现都是通用的,例如 ,它实际上不是由数组实现的,而是作为条目的链接链实现的。set
List
LinkedList
编辑:您实际上使用了该方法,而不是,但这里的原理是一样的。add(index, element)
set(index, element)
我想你的问题的确切答案是:
在 ArrayList 上设置初始大小可减少 nr。必须重新分配内部存储器的次数。 该列表由数组支持。如果指定初始容量为 0,则在第一次插入元素时,必须调整内部数组的大小。 如果您大致了解列表将包含多少个元素,则设置初始容量将减少 nr。使用列表时发生的内存重新分配。
虽然你的数组列表的容量为 10,但真正的列表在这里没有元素。add 方法用于将元素插入到实际列表中。由于它没有元素,因此不能将元素插入到 5 的索引中。
如果需要具有预定义大小的列表,还可以使用:
List<Integer> arr = Arrays.asList(new Integer[10]);
评论
List
Ints.asList(new int[10])
0
ArrayList
List
Arrays.asList
ArrayList
UnsupportedOperationException
如果要添加带有索引的元素,则可以改用数组。
String [] test = new String[length];
test[0] = "add";
评论
如果您想将 10 个项目添加到您的项目中,您可以尝试:ArrayList
for (int i = 0; i < 10; i++)
arr.add(i);
如果您已经声明了数组大小变量,则可以使用该变量而不是数字“10”size
ArrayList myList = 新 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);
}
/*声明 arraylist 的初始容量只不过是节省了内部的转移时间;当我们在内部添加元素时,它会检查容量以增加容量,您可以先在 0 索引处添加元素,然后添加 1,依此类推。*/
如果要使用 Collections.fill(list, obj);为了用重复的对象填充列表,或者你可以使用
ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
该行将 10 次 0 复制到 ArrayList 中
这可能会对某人有所帮助——
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 之后,我个人认为以下 API 方法更简洁,可以替代公认的答案。Stream
例如
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());
我们传递给构造函数的参数是为 N 个元素保留的内存容量,而不是数组列表的大小,即元素的数量,有关更多信息,可以参考官方文档:ArrayList 构造函数。
但是,您要实现的目标仍然可以通过在代码中进行少量更改来轻松完成,方法是最初分配具有一些默认值的 N 个元素,而不是使用 use 方法来更新值add()
set()
import java.util.*;
class Scratch {
public static void main(String[] args) {
int DEFAULT_INT_VALUE = 0;
// set first 10 elements with default value 0
List<Integer> arr = new ArrayList<Integer>(Collections.nCopies(10, DEFAULT_INT_VALUE));
// why to use set(5, 10) instead of add(5, 10)..? simply because add() will insert new element at index 5, which here actually we just to modify the 5 index element in array list
arr.set(5, 10);
// output: arr= [0, 0, 0, 0, 0, 10, 0, 0, 0, 0]
System.out.println("arr= " + arr.toString());
}
}
最好的方法是:
EvictingQueue<Integer> ignitionOnOdometer = EvictingQueue.create(size);
评论
set/add
ArrayList