有必要澄清两个定义:
大小表示列表中元素的数量。
容量表示内部数组的长度。换句话说,长度包含放置元素的位置数;
列表大小 = 2
当你使用 Arraylist 的默认构造函数创建一个列表时:
例如:
List<String> list = new ArrayList<>();
System.out.println(l.size());
输出为:0
为什么?
因为列表是空的,这是由列表的内部数组来解释的,当你使用ArrayList的默认构造函数时,内部数组是:
private static final Object[] EMPTY_ELEMENTDATA = {};
因此,长度值为 0(容量)的空对象数组。由于列表为空,因此大小为 0。
(元素数据的id=27)
当你将一个元素添加到列表中时,你的列表的大小会递增到 1,并且你的列表的初始内部数组会被另一个长度为 10(容量)的数组更改; (元素数据的id=30)
private static final int DEFAULT_CAPACITY = 10
(元素数据的id=30)
关于 ArrayList 的默认构造函数,API java 说:
API Java:https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList%28%29
public ArrayList()
Constructs an empty list with an initial capacity of ten.
也就是说,这个构造函数创建了一个空列表(大小等于0),初始容量为10个元素。(在列表中添加一个元素后,列表的容量变为10)
当您知道列表的大小后,您应该创建具有此大小的列表。为什么?因为add (E element) 方法的复杂性是 O(1) 摊销(当您的列表中有可用空间时),但如果您添加的元素多于列表的初始容量,则为 O(n)(最坏情况),在在这种情况下,分配了一个新数组(大小的 1.5 倍),并将旧数组复制到新数组。显然,此操作在性能和内存资源方面有成本。
所以,创建一个初始容量为 0 的列表是没有意义的。如果您不知道列表的初始容量,请使用默认构造函数,该构造函数会为您提供一个初始容量为 10 个元素的列表。
请记住,ArrayList 对大小和容量的定义是不同的:
From book Core Java 2: Fundamentals
将数组列表分配为新的ArrayList (100) //
容量为 100
不等于分配一个新数组为new Employee[100] //大小为100
数组列表的容量和数组的大小有一个重要的区别。如果你分配一个 100 的数组
条目,则该数组有 100 个插槽,可供使用。数组列表
容量为 100 个元素具有容纳 100 个元素的潜力
元素(实际上,超过 100 个,以额外的成本为代价)
重新分配);但一开始,即使在最初的
构造,数组列表根本不包含任何元素。