泛型数组列表
在许多程序设计语言中, 特别是在C++语言中, 必须在编译时就确定整个数组的大小.在 Java 中 , 解决这个问题最简单的方法是使用 Java 中另外一个被称为 Array List 的类。ArrayList 是一个采用类型参数 (type parameter) 的泛型类 (generic class) 。 为了指定数 组列表保存的元素对象类型, 需要用一对尖括号将类名括起来加在后面,(“菱形” 语法)
使用:
Java SE7 中, 可以省去右边的类型参数:
Arraylist staff= new Arraylist<>();
可以结合 new 操作符使用菱形 语法。编译器会检查新值是什么。 如果赋值给一个变址,或传递到某个方法, 或者从某个方 法返回 , 编译器会检查这个变报、 参数或方法的泛型类型, 然后将这个类型放在<>中.使用 add 方法可以将元素添加到数组列表中。
数组列表管理着对象引用的一个内部数组。如果调用 add 且内部数组已经满了, 数组列表就将自动地创建 一个更大的数组, 并将所有的对象从较小的数组中拷贝到较大的数组中。也能初始分配一个容量:
staff.ensureCapacity(lOO);
另外, 还可以把初始容量传递给 ArrayList 构造器:
Arraylist staff= new Arraylist<>(lOO);
- 如果为数组分配 100 个元素 的存储空间, 数组就有 100 个空位置可以使用
- 容量为 100 个元素的数组列表只是拥有保存 100 个元素的潜力(实际上, 重新分配空间的话, 将会超过 100), 但是在最初,甚至完成初始化构造之后, 数组列表根本就不含有任何元素。size 方法将返回数组列表中包含的实际元素数目
一旦能够确认数组列表的大小不再发生变化, 就可以调用 trimToSize 方法。 这个方法将 存储区域的大小调整为当前元素数量所需要的存储空间数目。 垃圾回收器将回收多余的存储 空间。一旦整理了数组列表的大小, 添加新元素就需要花时间再次移动存储块,
注释: Java SE 5.0以前的版本没有提供泛型类, 而是有一个 ArrayList 类, 其中保存类型为 Object 的元素, 它是 “ 自适应大小 ” 的集合。 如果一定要使用老版本的 Java, 则需要 将所有的后缀<... >删掉。
C++注释
ArrayList 类似于 C开的 vector 模板。 ArrayList 与 vector 都是泛型类型。 但是 C++ 的 vector 模板为了便于访问元素重栽了[]运算符。 由于 Java 没有运算符重栽, 所以必须调用显式的方法。 此外, C++向量是值拷贝。 如果a和 b 是两个向量, 赋值 操作 a=b 将会构造一个与b 长度相同的新向量 a, 并将所有的元素由b 拷贝到 a, 而在 Java 中, 这条赋值语句的操作结果是让 a 和b 引用同一个数组列表。
访问数组列表元素
使用 get 和 set 方法实现访问或改变数组元素的操作
为了插入一个新元素,位于n之后的所有元素都要向后移动一个位置,如果插入新元素后,数组列表的大小超过了容量,数组列表就会被重新分配存储空间。
没有泛型类时,原始的ArrayList类提供的get方法别无选择只能返回Object,因此,get方法的调用者必须对返回值进行类型转换:
Employee e = (E1ployee) staff .get(i);
原始的ArrayList存在一定的危险性。它的add和set方法允许接受任意类型的对象。编译不会给出任何警告,只有在检索对象并试图对它进行类型转换时,才会发现有问题。
使用toArray方法将数组元素拷贝到一个数组去
X[] a= new X[list.size()]; 1ist.toArray(a);
删除元素用 remove方法.