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

  1. 语法
    ArrayList arrlst = new ArrayList(initialCapacity:int);
  2. 增加元素
    使用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. 扩容逻辑
    按照当前容量,×1.5并且向下取整,创建一个新的ArrayList,并将原来的值赋给它,再加入新的值(逻辑相当于第一部分的手动扩容)
  2. 遍历
    使用增强for循环,注意ArrayList内部的元素都是Object类(为了便于转换)
    for (Object e: arrayList){}

三、泛型

  1. 为什么
    因为ArrayList内部的元素都是Object类,在做某些类的操作时(例如整数运算),需要先转换类型,再操作,很麻烦。
    因此,在定义ArrayList时就声明下其内部元素的类型
  2. 语法
    ArrayList<Integer> arrlst = new ArrayList<>(initialCapacity:int);
    使用尖括号标识,注意尖括号中是引用类型,不写基本类型

四、List接口

  1. ArrayList的劣势
    添加元素的时候比较复杂
  2. List接口
    ArrayList类是List的实现类,其关系如下。因此ArrayList类可用List来表示
  3. 使用方法
    of()方法可以直接生成对应数组。
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = List.of(1,2,3); // 因为of是静态方法,所以不用创建对象使用
  1. 注意事项
  • 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());
返回结果list1类型为ListN,list2类型为List12。当元素为1个或2个时候,of方法生成的对象类型为List12,大于2时为ListN。
  • 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]
posted @ 2022-09-12 18:31  风一样的我1  阅读(82)  评论(0)    收藏  举报