Day42--ArrayList
Day42--ArrayList
-
定义和概念
ArrayList是Java集合中的一个类,它属于集合(Collection)类型。它实现了List接口,用于存储有序的集合元素。与普通数组不同的是,ArrayList的大小可以自动增长和收缩,这使得它在处理元素数量不确定的情况时非常方便。- ArrayList允许有重复的元素
-
创建
ArrayList对象-
基本语法:
- 有两种常见的创建
ArrayList对象的方式。第一种是指定泛型类型并使用无参构造函数创建,例如,要创建一个存储整数的ArrayList,可以这样写:
ArrayList<Integer> list = new ArrayList<>();- 这里
ArrayList<Integer>中的Integer是泛型类型参数,表示这个ArrayList中只能存储整数类型(int的包装类是Integer)的元素。<>是Java 7及以后引入的菱形语法,编译器会根据左边声明的类型自动推断出ArrayList的具体泛型类型,等同于写new ArrayList<Integer>();。 - 第二种方式是使用有参构造函数,例如可以指定初始容量来创建
ArrayList。如果预先知道要存储的元素大概数量,可以通过这种方式提高性能,代码如下:
ArrayList<String> listWithCapacity = new ArrayList<>(10); // 这里创建了一个初始容量为10的、存储字符串的ArrayList - 有两种常见的创建
-
-
添加元素到
ArrayList-
add方法:ArrayList提供了add方法用于添加元素。例如,对于前面创建的存储整数的ArrayList,可以这样添加元素:
ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3);add方法有两个重载形式,一种是只传入要添加的元素(如上面的例子),元素会被添加到列表的末尾。另一种形式是可以指定插入元素的位置,例如add(int index, E element),其中index是要插入的位置索引,element是要插入的元素。需要注意的是,索引是从0开始的,而且插入元素时,会将指定索引位置及之后的元素向后移动一个位置。例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); list.add(1, 4); // 在索引为1的位置插入元素4,此时list变为[1, 4, 2, 3]
-
-
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));的含义asList(T... a)是Arrays类中的一个方法,它接受一个可变参数列表,并返回一个固定大小的List,该List由指定的元素组成。Arrays.asList(1, 2, 3)返回一个包含元素1、2和3的List。new ArrayList<>(Arrays.asList(1, 2, 3))使用Arrays.asList(1, 2, 3)返回的List来初始化新的ArrayList实例。- 这行代码创建了一个包含元素
1、2和3的ArrayList<Integer>,并将其赋值给变量list。
-
访问
ArrayList中的元素-
通过索引访问:
- 可以像访问数组元素一样访问
ArrayList中的元素,使用索引来获取指定位置的元素。例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); int element = list.get(0); // 获取索引为0的元素,这里element的值为1- 这里使用了
get方法,它接收一个索引参数,返回该索引位置对应的元素。如果索引超出范围(小于0或者大于等于ArrayList的大小),会抛出IndexOutOfBoundsException异常。
- 可以像访问数组元素一样访问
-
-
修改
ArrayList中的元素-
通过索引修改:
- 可以使用索引来修改
ArrayList中的元素,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); list.set(1, 4); // 将索引为1的元素修改为4,此时list变为[1, 4, 3]- 这里使用了
set方法,它接收两个参数,第一个参数是要修改的元素的索引,第二个参数是新的元素值。如果索引超出范围,同样会抛出IndexOutOfBoundsException异常。
- 可以使用索引来修改
-
-
删除
ArrayList中的元素-
remove方法:ArrayList提供了几种方式来删除元素。一种是通过元素的值来删除,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); list.remove(Integer.valueOf(2)); // 从列表中删除值为2的元素,此时list变为[1, 3]- 这里
remove方法会删除第一个匹配到的指定元素,它会调用元素的equals方法来判断元素是否相等。 - 另一种方式是通过索引来删除元素,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); list.remove(0); // 删除索引为0的元素,此时list变为[2, 3]- 当通过索引删除元素时,索引之后的元素会向前移动一个位置。同样,如果索引超出范围,会抛出
IndexOutOfBoundsException异常。
-
-
获取
ArrayList的大小-
size方法:- 可以使用
size方法来获取ArrayList中当前存储的元素个数,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); int size = list.size(); // size的值为3 - 可以使用
-
-
遍历
ArrayList-
使用
for循环:- 可以使用传统的
for循环通过索引来遍历ArrayList,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }- 这种方式在需要使用索引进行操作或者在循环过程中可能会修改列表大小的情况下比较有用。
- 可以使用传统的
-
使用增强
for循环(foreach):- 也可以使用增强
for循环来更简洁地遍历ArrayList,例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); for (Integer element : list) { System.out.println(element); }- 增强
for循环会自动遍历集合中的每个元素,不需要显式地使用索引,代码更加简洁,但在循环过程中不能方便地获取元素的索引,并且如果在循环内部需要修改集合(如删除元素),可能会导致ConcurrentModificationException异常,需要特别注意。
- 也可以使用增强
-
-
ArrayList与数组的转换-
ArrayList转数组:- 可以使用
toArray方法将ArrayList转换为数组。例如:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); Integer[] array = list.toArray(new Integer[0]);- 这里
toArray方法接收一个数组作为参数,如果传入的数组大小足够,就会将ArrayList中的元素填充到这个数组中并返回;如果传入的数组大小为0(如上面的例子)或者小于ArrayList的大小,会创建一个新的数组并返回。
- 可以使用
-
数组转
ArrayList:- 可以使用
Arrays.asList方法将数组转换为ArrayList,但需要注意的是,这种方式返回的ArrayList是Arrays类内部的一个私有静态内部类,它的add、remove等方法会抛出UnsupportedOperationException异常,因为它是一个固定大小的视图,并不是真正的ArrayList。如果想要一个真正可以修改大小的ArrayList,可以这样做:
Integer[] array = {1, 2, 3}; ArrayList<Integer> list = new ArrayList<>(Arrays.asList(array));- 这样就创建了一个可以正常添加、删除等操作的
ArrayList对象,并且它的初始元素是由数组中的元素构成的。
- 可以使用
-

浙公网安备 33010602011771号