Java中的初始ArrayList大小取决于内存?

时间:2014-10-02 19:15:08

标签: java arraylist jvm

我知道ArrayList可以包含“任意数量的项目”(只要你有内存)。但是,我想知道每个运行它的机器的列表的初始大小是否不同。如果我有8GB RAM而4GB RAM这会改变初始大小吗?谢谢!

ArrayList list = new ArrayList<Integer>();

4 个答案:

答案 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