Java学习——ArrayList
一、为什么要引入ArrayList
数组(Array)不能自动扩容,手动扩容代码如下,比较繁琐
例如:创建5个元素的数组arr0,要扩容到6元素,需要生成新的数组,再赋值。可通过Arrays.toString方法打印数组中元素
点击查看代码
int[] arr0 = new int[]{1,2,3,4,5};
int[] arr1 = new int[6];
System.out.println(Arrays.toString(arr0));
System.out.println(Arrays.toString(arr1));
//赋值
for (int i = 0; i < arr0.length; i++) {
arr1[i] = arr0[i];
}
二、使用ArrayList
- 语法
ArrayList arrlst = new ArrayList(initialCapacity:int); - 增加元素
使用add方法
点击查看代码
ArrayList list = new ArrayList(5);// 初始容量是 5, 默认的初始容量 10
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
// 内部封装了扩容逻辑, 按 1.5 倍扩容 5*1.5 => 7*1.5 => 10
list.add("f");
- 扩容逻辑
按照当前容量,×1.5并且向下取整,创建一个新的ArrayList,并将原来的值赋给它,再加入新的值(逻辑相当于第一部分的手动扩容) - 遍历
使用增强for循环,注意ArrayList内部的元素都是Object类(为了便于转换)
for (Object e: arrayList){}
三、泛型
- 为什么
因为ArrayList内部的元素都是Object类,在做某些类的操作时(例如整数运算),需要先转换类型,再操作,很麻烦。
因此,在定义ArrayList时就声明下其内部元素的类型 - 语法
ArrayList<Integer> arrlst = new ArrayList<>(initialCapacity:int);
使用尖括号标识,注意尖括号中是引用类型,不写基本类型
四、List接口
- ArrayList的劣势
添加元素的时候比较复杂 - List接口
ArrayList类是List的实现类,其关系如下。因此ArrayList类可用List来表示

- 使用方法
of()方法可以直接生成对应数组。
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = List.of(1,2,3); // 因为of是静态方法,所以不用创建对象使用
- 注意事项
- of方法生成的数组类型是未知的,可使用List类型声明。使用getclass方法查看类型,如下
点击查看代码
List<Integer> list1 = List.of(1,2,3);
List<Integer> list2 = List.of(1,2);
System.out.println(list1.getClass());
System.out.println(list2.getClass());
- of方法生成List不能添加新的元素。添加新元素时可将Arraylist与of方法结合使用。
点击查看代码
List<Integer> list0 = new ArrayList<>(3);
List<Integer> list1 = List.of(1,2,3);
list0.addAll(list1); //addAll的参数是Collection类型,List可向上转型为Collection
System.out.println(list0); //返回结果[1, 2, 3]

浙公网安备 33010602011771号