虽然 Java 中允许在运行时确定数组的大小。
int size = ...;
String[] staff = new String[size];
但是并没有完全解决运行时动态更改数组的问题。
一旦确定了数组的大小,就不能很容易地改变它。在 Java 中,解决这个问题最简单的方法是使用 Java 中另外一个类,名为 ArrayList。ArrayList 类类似于数组,但在添加或删除元素时,它能够自动地调整数组容量,而不要为此编写任何代码。
ArrayList 是一个有类型参数(type parameter) 的泛型类(generic class)。为了指定数组列表保存的元素对象的类型,需要用一对尖括号将类名括起来追加到 ArrayList 后面,例如 ArrayList<String>
。
1. 声明数组列表
声明和构造一个保存 String 对象的数组列表:
ArrayList<String> list = new ArrayList<String>();
在 Java 10 中,最好使用 var 关键字以避免重复写类名:
var list = new ArrayList<String>();
如果没有使用 var 关键字,可以省略右边的类型参数:
ArrayList<String> list = new ArrayList<>();
这称为 “菱形” 语法,因为空尖括号 <>
就像是一个菱形。可以结合 new 操作符使用菱形语法。编译器会检查新值要什么。如果赋值给一个变量,或传递到某个方法,或者从某个方法返回,编译器会检査这个变量、参数或方法的泛型类型,然后将这个类型放在 <>
中。在这个例子中,new ArrayList<>()
将赋至一个类型为 ArrayList<String>
的变量,所以泛型类型为 String
警告: 如果使用 var 声明 ArrayList,就不能使用菱形语法。以下声明:
var list = new ArrayList<>();
会生成一个 ArrayList<Object>
。
注释: Java 5 以前的版本没有提供泛型类,而是有一个保存 Object 类型元素的 ArrayList 类,它是一个“自适应大小”(one-size-fits-all)的集合。仍然可以使用没有后缀 <...>
的 ArrayList,这将被认为是删去了类型参数的一个“原始”类型。
注释: 在 Java 的老版本中,程序员使用 Vector 类实现动态数组。不过,ArrayList 类更加高效,没有任何理由再使用 Vector 类。
使用 add 方法可以将元素添加到数组列表中。例如,下面展示了如何将 String 对象添加到一个数组列表中:
ArrayList<String> staff = new ArrayList<String>();
staff.add(new String("Harry Hacker"));
staff.add(new String("Tommy Tester"));