5.3 泛型数组列表
Java允许在运行时确定数组的大小
ArrayList
是一个采用参数类型(type parameter)
的泛型类(generic class)
"菱形"语法
:为了指定数组列表保存的元素对象类型,需要用一对尖括号
将类名括起来加在后面,因为空尖括号"<>"
就像一个菱形故而称之- 使用
add方法
可以将元素添加到数组列表中数组列表
管理着对象引用的一个内部数组- 如果调用
add
且内部数组已经满了,数组列表就将自动创建一个更大的数组, 并将所有的对象从较小的数组拷贝到较大的数组中
ensureCapacity方法
:如果已经清楚或者能够估计出数组可能存储的元素数量,就可以在填充数组之前调用- 可以把
初始容量
传递给ArrayList构造器 size方法
:返回数组列表中包含的实际元素数目trimToSize方法
: 一旦能够确认列表的大小不再发生变化,就可以调用.- 这个方法将存储区域的大小调整为当前元素数量所需要的存储空间数目.垃圾回收站将回收多余的存储空间
- 一旦整理了数组列表的大小,添加新元素就需要花时间再次移动数据块,
应该在确认不会添加任何元素时,再调用trimToSize方法
API | 所在包 | 描述 | 参数 | 参数描述 |
---|---|---|---|---|
ArrayList<E>() |
java.util.ArrayList<E> |
构造一个空数组列表 | ||
ArrayList<E>(int initialCapacity) |
java.util.ArrayList<E> |
用指定容量构造一个空数组列表 | initialCapacity | 数组列表初始容量 |
boolean add(E obj) |
java.util.ArrayList<E> |
在数组列表的尾端添加一个元素 | obj | 添加的元素 |
int size() |
java.util.ArrayList<E> |
返回存储在数组列表中的当前元素数量 (该值将小于等于数组列表的容量) | ||
void ensureCapacity(int capacity) |
java.util.ArrayList<E> |
确保数组列表在不重新分配存储空间的情况下就能保存给定数量的元素 | capacity | 需要的存储容量 |
void trimToSize() |
java.util.ArrayList<E> |
将数组列表的存储空间削减到当前尺寸 |
5.3.1 访问数组列表元素
- ArrayList类
并不是Java程序设计语言的一部分
原始ArrayList类
:- 没有泛型类时,原始的ArrayList类提供的get方法
只能返回Object
, 因此,get方法的调用者必须对返回值进行类型转换
- 原始的ArrayList存在一定危险性.它的add和set方法
允许接受任意类型的对象
, 编译器不会给出任何警告,只有在检索对象并试图对它进行类型转换时才会发现有问题
- 没有泛型类时,原始的ArrayList类提供的get方法
带索引参数的add方法
:- 除了在数组裂变的尾部追加元素之外,还可以
在数组列表的中间
插入元素 - 为了插入一个元素,插入位置之后的所有元素都要
向后移动一个位置
- 如果插入新元素后,数组列表的大小超过了容量,
数组列表就会被重新分配存储空间
- 除了在数组裂变的尾部追加元素之外,还可以
remove方法
:- 可以从数组列表中间删除一个元素
- 位于删除位置之后的所有元素都
向前移动一个位置
,并且数组的大小减1
- 对数组实施插入和删除元素的操作
其效率比较低
.如果数组存储的元素比较多, 又经常在中间位置插入、删除元素,就应该考虑链表
- 可以使用
foreach循环
遍历数组列表
API | 所在包 | 描述 | 参数 |
---|---|---|---|
void set(int index,E obj) |
java.util.ArrayList<T> |
设置数组列表指定位置的元素值, 这个操作将覆盖这个位置的原有内容 |
index :位置 obj :新的值 |
E get(int index) |
java.util.ArrayList<T> |
获得的元素位置 | index :获得的元素位置(必须在0~size()-1之间) |
void add(int index,E obj) |
java.util.ArrayList<T> |
向后移动元素,以便插入元素 | index :插入位置(必须在0~size()-1之间), obj :新元素 |
E remove(int index) |
java.util.ArrayList<T> |
删除一个元素,并将后面的元素向前移动 被删除元素又返回值返回 |
index :被删除元素的位置(必须介于0~size()-1之间) |
5.3.2 类型化与原始数组列表的兼容性
- 可以将一个类型化的数组列表传递给
update方法
,而不需要进行任何类型转换 - 将一个原始ArrayList赋给一个类型化ArrayList会得到一个警告.使用类型转换并不能避免警告
- 一旦确保不会造成严重后果,可以用
@SuppressWarning("unchecked")
标注来标记这个变量能够接受类型转换