记录:294
场景:Java的ArrayList理解与应用。把对ArrayList操作,从查、增、改、删的角度去理解和应用ArrayList的API。
版本:
- JDK 1.8
- Spring Boot 2.6.3
名词:
API,应用程序接口(Application Programming Interface)。API是一些预定的函数,提供给应用程序访问。调用方无需关注API内部源码和内部工作机制等细节,只需根据API提供方发布的调用方式调用API就行。
一、基础
1.基础知识
1.1 ArrayList基础知识
(1)ArrayList底层是一个可变数组,使用transient关键字修饰的Object[]数组。
(2)ArrayList实现List、Collection等接口,实现了List的全部操作。
(3)ArrayList支持动态扩容,在做add操作时,容量不足时,会自动扩容。扩容时会使用Arrays.copyOf函数进行拷贝操作。扩容规则:(oldCapacity >> 1),即扩展原有容量一半。
(4)ArrayList是线程不安全集合。在多线程操作时,需使用者自行加锁处理。
(5)ArrayList允许写入null。
1.2 ArrayList继承类和实现的接口
ArrayList在jdk中全路径:java.util.ArrayList。
ArrayList继承的抽象类:
- java.util.AbstractList
- java.util.AbstractCollection
ArrayList实现的接口:
- java.util.List
- java.util.RandomAccess
- java.lang.Cloneable
- java.io.Serializable
- java.util.Collection
- java.lang.Iterable
1.3 ArrayList内部类
ArrayList内部类,包括如下:
- java.util.ArrayList.Itr
- java.util.ArrayList.ListItr
- java.util.ArrayList.SubList
- java.util.ArrayList.ArrayListSpliterator
2.应用场景
ArrayList,只要使用集合的场景都可以使用。
二、应用
1.创建
创建,就是创建ArrayList操作,就能得到一个实际Java对象。
1.1操作场景
操作场景,函数功能说明。
(1)使用new创建长度为0的List对象。
(2)使用new创建长度为100的List对象。
(3)使用实现Collection接口的类创建对象。
1.2操作实例
操作实例,函数应用实例。
- /**
- * 1.使用new关键字创建ArrayList对象实例
- */
- public static void f_new() {
-
- // 1.使用new创建长度为0的List对象
- List
list01 = new ArrayList<>(); - // 2.使用new创建长度为100的List对象
- List
list02 = new ArrayList<>(100); - // 3.使用实现Collection extends E>接口的类创建对象
- HashSet
hs = new HashSet<>(); - hs.add("杭州");
- hs.add("苏州");
- hs.add("厦门");
- List
list03 = new ArrayList<>(hs); - list03.forEach(str -> {
- System.out.println("城市名称: " + str);
- });
- }
2.查
查,就是查询操作。
2.1操作场景
操作场景,函数功能说明。
(1)使用forEach遍历ArrayList集合。
(2)使用for循环,搭配get(intindex),遍历ArrayList集合。
(3)使用增强for循环,遍历ArrayList集合。
(4)使用ListIterator
(5)使用ListIterator
(6)使用iterator(),遍历ArrayList集合。
(7)使用spliterator(),遍历ArrayList集合。
(8)使用stream(),把ArrayList转换为Stream,遍历ArrayList集合。
(9)使用sort(Comparatorc)排序,遍历ArrayList集合。
(10)使用get(intindex),获取ArrayList指定位置的元素。
(11)使用size(),获取ArrayList的size。
(12)使用isEmpty(),判断ArrayList是否为空。
(13)使用contains(),判断ArrayList是否包含指定对象。
(14)使用indexOf(),获取ArrayList索引位置。
(15)使用lastIndexOf()获取ArrayList最后一个索引位置。
(16)使用clone(),复制ArrayList的元素。
2.2操作实例
操作实例,函数应用实例。
- /**
- * 1.1 使用forEach遍历ArrayList集合
- */
- public static void f1_1() {
- // 1.获取数据
- List
list = getList(); - // 2.遍历数据
- list.forEach(girl -> {
- System.out.println("girl信息: " + girl.toString());
- });
- }
-
- /**
- * 1.2 使用for循环,搭配get(int index),遍历ArrayList集合
- */
- public static void f1_2() {
- // 1.获取数据
- List
list = getList(); - // 2.遍历数据
- for (int i = 0; i < list.size(); i++) {
- System.out.println("girl信息: " + list.get(i));
- }
- }
-
- /**
- * 1.3 使用增强for循环,遍历ArrayList集合
- */
- public static void f1_3() {
- // 1.获取数据
- List
list = getList(); - // 2.遍历数据
- for (GirlVo girlVo : list) {
- System.out.println("girl信息: " + girlVo);
- }
- }
-
- /**
- * 1.4 使用ListIterator
listIterator(),遍历ArrayList集合 - */
- public static void f1_4() {
- // 1.获取数据
- List
list = getList(); - // 2.使用listIterator
- ListIterator
iterator = list.listIterator(); - // 3.使用Iterator遍历
- while (iterator.hasNext()) {
- System.out.println("遍历Iterator: " + iterator.next());
- }
- }
-
- /**
- * 1.5 使用ListIterator
listIterator(int index),按照指定位置开始, - * 遍历ArrayList集合
- */
- public static void f1_5() {
- // 1.获取数据
- List
list = getList(); - // 2.使用listIterator
- ListIterator
iterator = list.listIterator(2); - // 3.使用Iterator遍历
- while (iterator.hasNext()) {
- System.out.println("遍历Iterator: " + iterator.next());
- }
- }
-
- /**
- * 1.6 使用iterator(),遍历ArrayList集合
- */
- public static void f1_6() {
- // 1.获取数据
- List
list = getList(); - // 2.使用iterator
- Iterator
iterator = list.iterator(); - // 3.使用iterator遍历
- while (iterator.hasNext()) {
- System.out.println("遍历Iterator: " + iterator.next());
- }
- }
-
- /**
- * 1.7 使用spliterator(),遍历ArrayList集合
- * JDK 1.8
- */
- public static void f1_7() {
- // 1.获取数据
- List
list = getList(); - // 2.使用Spliterator
- Spliterator
iterator = list.spliterator(); - // 3.使用Spliterator遍历
- iterator.forEachRemaining(girlVo -> {
- System.out.println("使用分流器遍历: " + girlVo);
- });
- }
-
- /**
- * 1.8 使用stream(),把ArrayList转换为Stream,遍历ArrayList集合
- */
- public static void f1_8() {
- // 1.获取数据
- List
list = getList(); - // 2.ArrayList转换为
- Stream
stream = list.stream(); - // 3.遍历数据
- stream.forEach(girlVo -> {
- System.out.println("girl信息: " + girlVo);
- });
- }
-
- /**
- * 1.9 使用sort(Comparator super E> c)排序,遍历ArrayList集合
- * 需自定义Comparator比较器,本例按照GirlVo的年龄排序.
- */
- public static void f1_9() {
- // 1.获取数据
- List
list = getList(); - System.out.println("操作前遍历信息:");
- list.forEach(girlVo -> {
- System.out.println("girl信息: " + girlVo);
- });
- // 2.比较器确定排序规则
- list.sort((c1, c2) -> {
- return (int) (c1.getAge() - c2.getAge());
- });
- System.out.println("操作后遍历信息:");
- list.forEach(girlVo -> {
- System.out.println("girl信息: " + girlVo);
- });
- }
-
- /**
- * 1.10 使用get(int index),获取ArrayList指定位置的元素
- */
- public static void f1_10() {
- // 1.获取数据
- List
list = getList(); - // 2.使用get获取元素
- GirlVo girlVo = list.get(2);
- System.out.println("girl信息: " + girlVo);
- }
-
- /**
- * 1.11 使用size(),获取ArrayList的size
- */
- public static void f1_11() {
- // 1.获取数据
- List
list = getList(); - // 2.使用size
- int size = list.size();
- System.out.println("List的size: " + size);
- }
-
- /**
- * 1.12 使用isEmpty(),判断ArrayList是否为空
- */
- public static void f1_12() {
- // 1.获取数据
- List
list = getList(); - // 2.使用isEmpty
- boolean bl = list.isEmpty();
- System.out.println("List是否为空: " + bl);
- }
-
- /**
- * 1.13使用contains(),判断ArrayList是否包含指定对象
- */
- public static void f1_13() {
- // 1.获取数据
- List
list = getList(); - // 2.使用contains
- GirlVo girl01 = GirlVo.builder().girlId("1001").girlName("张一").age(27).height(169).cupSize("F").build();
- boolean bl = list.contains(girl01);
- System.out.println("List是包含指定对象: " + bl);
- }
-
- /**
- * 1.14 使用indexOf(),获取ArrayList索引位置
- */
- public static void f1_14() {
- // 1.获取数据
- List
list = getList(); - // 2.使用indexOf
- GirlVo girl01 = GirlVo.builder().girlId("1001").girlName("张一").age(27).height(169).cupSize("F").build();
- int index = list.indexOf(girl01);
- System.out.println("girl01的索引位置: " + index);
- }
-
- /**
- * 1.15 使用lastIndexOf()获取ArrayList最后一个索引位置
- */
- public static void f1_15() {
- // 1.获取数据
- List
list = getList(); - // 2.使用lastIndexOf
- GirlVo girl01 = GirlVo.builder().girlId("1001").girlName("张一").age(27).height(169).cupSize("F").build();
- list.add(girl01);
- int index = list.lastIndexOf(girl01);
- System.out.println("girl01的最后索引位置: " + index);
- }
-
- /**
- * 1.16 使用clone(),复制ArrayList的元素
- */
- public static void f1_16() {
- // 1.获取数据
- ArrayList
arrayList = new ArrayList<>(); - arrayList.add("杭州");
- arrayList.add("苏州");
- arrayList.add("厦门");
- // 2.使用clone
- Object obj = arrayList.clone();
- System.out.println("ArrayList的clone: " + obj);
- }
3.增
增,就是增加操作。
3.1操作场景
操作场景,函数功能说明。
(1)使用add,在ArrayList尾部添加元素。
(2)使用add(intindex,Eelement),在指定位置添加元素。
(3)使用addAll(Collectionc),把Collection添加到ArrayList。
(4)使用addAll(intindex,Collectionc),从指定index位置开始添加Collection集合,插入前在index位置及其后面的元素,会存放在插入的Collection后面。
3.2操作实例
操作实例,函数应用实例。
- /**
- * 2.1 使用add,在ArrayList尾部添加元素
- */
- public static void f2_1() {
- // 1.创建对象和创建元素
- List
list = new ArrayList<>(); - GirlVo girl01 = GirlVo.builder().girlId("1001").girlName("张一").age(27).height(169).cupSize("F").build();
- GirlVo girl02 = GirlVo.builder().girlId("1002").girlName("王二").age(29).height(175).cupSize("B").build();
- GirlVo girl03 = GirlVo.builder().girlId("1003").girlName("刘五").age(24).height(160).cupSize("B").build();
- GirlVo girl04 = GirlVo.builder().girlId("1004").girlName("陈六").age(21).height(168).cupSize("C").build();
- GirlVo girl05 = GirlVo.builder().girlId("1005").girlName("赵七").age(25).height(169).cupSize("C").build();
- GirlVo girl06 = GirlVo.builder().girlId("1006").girlName("张八").age(26).height(165).cupSize("A").build();
- // 2.把元素添加到ArrayList中
- list.add(girl01);
- list.add(girl02);
- list.add(girl03);
- list.add(girl04);
- list.add(girl05);
- list.add(girl06);
- // 3.遍历ArrayList
- for (GirlVo girlVo : list) {
- System.out.println("girlVo信息: " + girlVo);
- }
- }
-
- /**
- * 2.2 使用add(int index, E element),在指定位置添加元素.
- * 如果index位置在list中有元素,则新元素占用这个位置.
- * 把原来的元素放到index+1位置
- */
- public static void f2_2() {
- // 1.创建对象
- List
list = new ArrayList<>(); - // 2.添加数据
- list.add("北京");
- list.add("杭州");
- list.add("厦门");
- System.out.println("调用前遍历: ");
- list.forEach(girl -> {
- System.out.println("girlVo信息: " + girl);
- });
- // 3.指定索引添加数据
- list.add(2, "福州");
- System.out.println("调用后遍历: ");
- list.forEach(girl -> {
- System.out.println("girlVo信息: " + girl);
- });
- }
-
- /**
- * 2.3 使用addAll(Collection extends E> c),把Collection添加到ArrayList
- */
- public static void f2_3() {
- // 1.创建对象
- List
list = new ArrayList<>(); - List
list01 = new ArrayList<>(); - List
list02 = new ArrayList<>(); - // 2.添加数据
- list01.add("北京");
- list01.add("杭州");
- list01.add("厦门");
- list02.add("苏州");
- list02.add("南京");
- list02.add("天津");
- // 3.使用addAll
- list.addAll(list01);
- list.addAll(list02);
- list.forEach(girl -> {
- System.out.println("girlVo信息: " + girl);
- });
- }
-
- /**
- * 2.4 使用addAll(int index, Collection extends E> c),
- * 从指定index位置开始添加Collection集合,
- * 插入前在index位置及其后面的元素,会存放在插入的Collection后面
- */
- public static void f2_4() {
- // 1.创建对象
- List
list01 = new ArrayList<>(); - List
list02 = new ArrayList<>(); - // 2.添加数据
- list01.add("北京");
- list01.add("杭州");
- list01.add("厦门");
- list02.add("苏州");
- list02.add("南京");
- list02.add("天津");
- // 3.使用addAll
- list01.addAll(1, list02);
- list01.forEach(girl -> {
- System.out.println("girlVo信息: " + girl);
- });
- }
4.改
改,就是修改操作。
4.1操作场景
操作场景,函数功能说明。
(1)使用set(intindex,Eelement),修改指定索引的元素如果index位置在list中有元素,则把新元素占用这个位置.原来的元素就没有了。
(2)使用subList(intfromIndex,inttoIndex),截取指定索引范围内的ArrayList。
(3)使用replaceAll(UnaryOperator
(4)使用Object[]toArray(),转换ArrayList为数组。
(5)使用
(6)使用for循环,修改ArrayList内部元素。
4.2操作实例
操作实例,函数应用实例。
- /**
- * 3.1 使用set(int index, E element),修改指定索引的元素
- * 如果index位置在list中有元素,则把新元素占用这个位置.原来的元素就没有了.
- */
- public static void f3_1() {
- // 1.创建对象
- List
list = new ArrayList<>(); - // 2.添加数据
- list.add("北京");
- list.add("杭州");
- list.add("厦门");
- System.out.println("调用前遍历: ");
- list.forEach(girl -> {
- System.out.println("girlVo信息: " + girl);
- });
- // 3.修改指定索引元素
- list.set(2, "福州");
- System.out.println("调用后遍历: ");
- list.forEach(girl -> {
- System.out.println("girlVo信息: " + girl);
- });
- }
-
- /**
- * 3.2 使用subList(int fromIndex, int toIndex),截取指定索引范围内的ArrayList
- */
- public static void f3_2() {
- // 1.创建对象
- List
list = new ArrayList<>(); - // 2.添加数据
- list.add("北京");
- list.add("杭州");
- list.add("厦门");
- list.add("苏州");
- list.add("南京");
- System.out.println("调用前遍历: ");
- list.forEach(girl -> {
- System.out.println("girlVo信息: " + girl);
- });
- // 3.截取指定索引范围内元素
- List
list01 = list.subList(1, 3); - System.out.println("调用后遍历: ");
- list01.forEach(girl -> {
- System.out.println("girlVo信息: " + girl);
- });
- }
-
- /**
- * 3.3 使用replaceAll(UnaryOperator
operator),修改ArrayList内部元素 - * JDK 1.8
- */
- public static void f3_3() {
- // 1.获取数据
- List
list = getList(); - System.out.println("操作前遍历信息:");
- list.forEach(girlVo -> {
- System.out.println("girl信息: " + girlVo);
- });
- // 2.修改元素
- list.replaceAll(girlVo -> {
- if (Objects.equals(girlVo.getCupSize(), "B")) {
- girlVo.setCupSize("B+");
- }
- return girlVo;
- });
- System.out.println("操作后遍历信息:");
- list.forEach(girlVo -> {
- System.out.println("girl信息: " + girlVo);
- });
- }
-
- /**
- * 3.4 使用Object[] toArray(),转换ArrayList为数组
- */
- public static void f3_4() {
- // 1.获取数据
- List
list = getList(); - // 2.使用toArray
- Object[] obj = list.toArray();
- // 3.遍历数据数组
- for (int i = 0; i < obj.length; i++) {
- System.out.println("girl信息: " + obj[i]);
- }
- }
-
- /**
- * 3.5 使用
T[] toArray(T[] a),转换ArrayList为数组 - */
- public static void f3_5() {
- // 1.获取数据
- List
list = getList(); - // 2.使用toArray
- Object[] obj = list.toArray();
- // 3.使用toArray(T[] a)
- Object[] obj02 = list.toArray(obj);
- System.out.println("obj02数组长度: " + obj02.length);
- }
-
- /**
- * 3.6 使用for循环,修改ArrayList内部元素
- */
- public static void f3_6() {
- // 1.获取数据
- List
list = getList(); - System.out.println("操作前遍历信息:");
- list.forEach(girlVo -> {
- System.out.println("girl信息: " + girlVo);
- });
- // 2.修改元素
- for (GirlVo girlVo : list) {
- if (Objects.equals(girlVo.getCupSize(), "C")) {
- girlVo.setCupSize("C+");
- }
- }
- System.out.println("操作后遍历信息:");
- list.forEach(girlVo -> {
- System.out.println("girl信息: " + girlVo);
- });
- }
5.删
删,就是删除操作。
5.1操作场景
操作场景,函数功能说明。
(1)使用remove(intindex),删除指定位置元素。
(2)使用remove(Objecto),删除指定元素。
(3)使用Collection>c,删除ArrayList内指定集合内元素。
(4)使用retainAll(Collection>c),保留ArrayList内指定集合的数据,其它删除。
(5)使用removeIf(Predicatefilter),删除符合条件的元素。
(6)使用clear清空ArrayList。
5.2操作实例
操作实例,函数应用实例。
- /**
- * 4.1 使用remove(int index),删除指定位置元素
- */
- public static void f4_1() {
- // 1.创建对象
- List
list = new ArrayList<>(); - // 2.添加数据
- list.add("北京");
- list.add("杭州");
- list.add("厦门");
- System.out.println("调用前遍历: ");
- list.forEach(city -> {
- System.out.println("城市信息: " + city);
- });
- // 3.删除指定索引
- list.remove(1);
- System.out.println("调用后遍历: ");
- list.forEach(city -> {
- System.out.println("城市信息: " + city);
- });
- }
-
- /**
- * 4.2 使用remove(Object o),删除指定元素
- */
- public static void f4_2() {
- // 1.创建对象
- List
list = new ArrayList<>(); - // 2.添加数据
- list.add("北京");
- list.add("杭州");
- list.add("厦门");
- System.out.println("调用前遍历: ");
- list.forEach(girl -> {
- System.out.println("城市信息: " + girl);
- });
- // 3.删除指定元素
- list.remove("杭州");
- System.out.println("调用后遍历: ");
- list.forEach(girl -> {
- System.out.println("城市信息: " + girl);
- });
- }
-
- /**
- * 4.3 使用Collection> c,删除ArrayList内指定集合内元素
- */
- public static void f4_3() {
- // 1.创建对象
- List
list = new ArrayList<>(); - List
list01 = new ArrayList<>(); - // 2.添加数据
- list.add("北京");
- list.add("杭州");
- list.add("苏州");
- list.add("南京");
- list.add("天津");
- list.add("厦门");
- list01.add("苏州");
- list01.add("南京");
- list01.add("天津");
- System.out.println("调用前遍历: ");
- list.forEach(girl -> {
- System.out.println("城市信息: " + girl);
- });
- // 3.删除指定集合内元素
- list.removeAll(list01);
- System.out.println("调用后遍历: ");
- list.forEach(girl -> {
- System.out.println("城市信息: " + girl);
- });
- }
-
- /**
- * 4.4 使用retainAll(Collection> c),保留ArrayList内指定集合的数据,其它删除
- */
- public static void f4_4() {
- // 1.创建对象
- List
list = new ArrayList<>(); - List
list01 = new ArrayList<>(); - // 2.添加数据
- list.add("北京");
- list.add("杭州");
- list.add("苏州");
- list.add("南京");
- list.add("天津");
- list.add("厦门");
- list01.add("苏州");
- list01.add("南京");
- list01.add("天津");
- System.out.println("调用前遍历: ");
- list.forEach(girl -> {
- System.out.println("城市信息: " + girl);
- });
- // 3.删除指定集合之外数据
- list.retainAll(list01);
- System.out.println("调用后遍历: ");
- list.forEach(girl -> {
- System.out.println("城市信息: " + girl);
- });
- }
-
- /**
- * 4.5 使用removeIf(Predicate super E> filter),删除符合条件的元素
- * JDK 1.8
- */
- public static void f4_5() {
- // 1.获取数据
- List
list = getList(); - System.out.println("操作前遍历信息:");
- list.forEach(girlVo -> {
- System.out.println("girl信息: " + girlVo);
- });
- // 2.删除符合条件元素
- list.removeIf(girlVo -> {
- return Objects.equals(girlVo.getCupSize(), "B");
- });
- System.out.println("操作后遍历信息:");
- list.forEach(girlVo -> {
- System.out.println("girl信息: " + girlVo);
- });
- }
-
- /**
- * 4.6 使用clear清空ArrayList
- */
- public static void f4_6() {
- // 1.创建对象
- List
list = new ArrayList<>(); - // 2.添加数据
- list.add("北京");
- list.add("杭州");
- list.add("厦门");
- System.out.println("调用前遍历: ");
- list.forEach(city -> {
- System.out.println("城市信息: " + city);
- });
- // 3.清空ArrayList
- list.clear();
- System.out.println("调用后遍历: ");
- list.forEach(city -> {
- System.out.println("城市信息: " + city);
- });
- }
6.共用代码
(1)获取List
- /**
- * 获取List
集合 - * */
- public static List
getList() { - List
list = new ArrayList<>(); - GirlVo girl01 = GirlVo.builder().girlId("1001").girlName("张一").age(27).height(169).cupSize("F").build();
- GirlVo girl02 = GirlVo.builder().girlId("1002").girlName("王二").age(29).height(175).cupSize("B").build();
- GirlVo girl03 = GirlVo.builder().girlId("1003").girlName("刘五").age(24).height(160).cupSize("B").build();
- GirlVo girl04 = GirlVo.builder().girlId("1004").girlName("陈六").age(21).height(168).cupSize("C").build();
- GirlVo girl05 = GirlVo.builder().girlId("1005").girlName("赵七").age(25).height(169).cupSize("C").build();
- GirlVo girl06 = GirlVo.builder().girlId("1006").girlName("张八").age(26).height(165).cupSize("A").build();
- list.add(girl01);
- list.add(girl02);
- list.add(girl03);
- list.add(girl04);
- list.add(girl05);
- list.add(girl06);
- return list;
- }
(2)GirlVo对象。
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- @Builder
- public class GirlVo {
- /**ID号*/
- String girlId;
- /**姓名*/
- String girlName;
- /**年龄*/
- long age;
- /**身高*/
- double height;
- /**罩杯*/
- String cupSize;
- }
以上,感谢。
2022年8月31日