章
目
录
Java 中的ArrayList表示一个可调整大小的对象数组,它允许我们添加、删除、查找、排序和替换元素。在内部,arraylist 维护一个固定大小的数组来添加/维护对象,并且其所有方法都访问此后备数组以进行各自的操作。
ArrayList不公开公开后备数组的长度,并且只能使用size()方法检索存储元素的数量。
1.ArrayList的内部实现
在内部,ArrayList类是使用数组(也称为支持数组)实现的。从ArrayList添加或删除的元素实际上是在后备数组中修改的。
public class ArrayList<E> ... {
transient Object[] elementData; //backing array
private int size; //arraylist size
//...
}
当我们将对象添加到数组列表时,它们将存储在支持数组中。使用size属性跟踪存储在数组中的元素数量。
2.ArrayList大小
ArrayList的大小是指ArrayList中存储的元素(包括空值)的数量。
- 当我们在数组列表中的任意位置添加元素时,大小会增加 1。
- 当我们删除一个元素时,大小会减 1。
- 当我们替换一个元素时,大小不会改变。
- 当我们清除 arraylist 时,大小会重置为 0。
我们用一个例子来验证一下上面的情况。我们将初始化一个空数组列表,并执行一些添加/删除/清除操作。每次操作后,我们都会检查 arraylist 的大小。
ArrayList<Integer> arraylist = new ArrayList<>();
Assertions.assertEquals(0, arraylist.size()); //Initial size = 0
arraylist.add(1001);
Assertions.assertEquals(1, arraylist.size()); //Add increments the size by 1
arraylist.add(1002);
Assertions.assertEquals(2, arraylist.size()); //Add increments the size by 1
arraylist.set(0, 1000);
Assertions.assertEquals(2, arraylist.size()); //replace does not change the size
arraylist.remove(1002);
Assertions.assertEquals(1, arraylist.size()); //remove decrements the size by 1
arraylist.clear();
Assertions.assertEquals(0, arraylist.size()); //clear resets the size to 0
3.ArrayList长度
数组列表的长度是支持数组的长度。但是,由于ArrayList类不公开初始容量,因此无法使用公共 API 来验证长度。
请注意,arraylist 的默认初始容量为 10,这将创建一个长度为 10 的空后备数组。因此,使用默认无参数构造函数创建的空 arraylist 始终具有长度为 10 的后备数组。我们可以提供自定义初始容量(或数组长度)作为构造函数参数。
ArrayList<Integer> arraylist = new ArrayList<>(); // backing array of length 10
ArrayList<Integer> arraylist = new ArrayList<>(64); // backing array of length 64
4. ArrayList trimToSize()
一个有趣的方法trimToSize() 使ArrayList实例的长度成为列表的当前大小。应用程序可以使用此操作来最小化ArrayList实例的存储空间。
修剪操作使用'size'
属性创建一个新的后备数组并将元素存储在数组中。在新的支持数组中,所有数组索引都存储一个值。请注意,有效值也可以为null。
arraylist.trimToSize();
5. 结论
为了简单起见,Java ArrayList 类不会公开支持数组的长度,而仅使用 size() 方法公开其中当前存储的元素的数量。尽管如此,了解长度的概念还是有好处的,这样当后备数组包含足够的索引而不指向任何值时,我们就可以使用trimToSize()方法。