我知道ArrayList可以包含“任意数量的项目”(只要你有内存)。但是,我想知道每个运行它的机器的列表的初始大小是否不同。如果我有8GB RAM而4GB RAM这会改变初始大小吗?谢谢!
ArrayList list = new ArrayList<Integer>();
答案 0 :(得分:3)
默认情况下,初始容量为10.您始终可以使用接受容量参数的构造函数,以便以不同的容量启动。
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
答案 1 :(得分:3)
ArrayList
的初始大小,如果使用no-arg构造函数引用javadoc:
构造一个初始容量为十的空列表。
所以它不依赖于任何东西,它也不依赖于RAM大小。
然而,在后台有一些聪明的优化。如果检查ArrayList
的Oracle实现,您将看到在这种情况下将使用初始的空内部数组,因此不会分配任何数组直到您实际向列表中添加一些元素 - 在这种情况下,将创建一个大小为10的数组。
尝试添加第11个元素后,内部数组将“调整大小”。新的大小也取决于实现,Oracle在1.7.0版本中使用了50%的增量,因此添加第11个元素将导致分配大小为15的新数组。
对于好奇的,您可以使用以下方法查询ArrayList
的内部数组的大小(解决方案使用反射):
public static int getCap(ArrayList<?> list) throws Exception {
Field f = list.getClass().getDeclaredField("elementData");
f.setAccessible(true);
Object[] o = (Object[]) f.get(list);
return o.length;
}
ArrayList<String> list = new ArrayList<>();
System.out.println(getCap(list)); // Prints 0
list.add("");
System.out.println(getCap(list)); // Prints 10
for (int i = 1; i < 11; i++)
list.add("");
System.out.println(getCap(list)); // Prints 15
for (int i = 11; i < 16; i++)
list.add("");
System.out.println(getCap(list)); // Prints 22
答案 2 :(得分:2)
默认情况下,使用initial capacity of 10创建(无论可用的RAM如何)。
答案 3 :(得分:1)
默认情况下,ArrayList的大小为10,并且按大小10增长。 例如
ArrayList list = new ArrayList<Integer>();
这里列表的大小为10。 添加11对象后,大小将增加10并将变为20 您可以通过调用具有大小的构造函数来更改初始大小。参见示例。
示例:
ArrayList list = new ArrayList<Integer>(2);
list.add(1); // size() == 1
list.add(2); // size() == 2, list is "filled"
list.add(3); // size() == 3, list is expanded to make room for the third element