记录: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<?extendsE>接口的类创建对象。
1.2操作实例
操作实例,函数应用实例。
/**
* 1.使用new关键字创建ArrayList对象实例
*/
public static void f_new() {
// 1.使用new创建长度为0的List对象
List<GirlVo> list01 = new ArrayList<>();
// 2.使用new创建长度为100的List对象
List<GirlVo> list02 = new ArrayList<>(100);
// 3.使用实现Collection<? extends E>接口的类创建对象
HashSet<String> hs = new HashSet<>();
hs.add("杭州");
hs.add("苏州");
hs.add("厦门");
List<String> 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<E>listIterator(),遍历ArrayList集合。
(5)使用ListIterator<E>listIterator(intindex),按照指定位置开始,遍历ArrayList集合。
(6)使用iterator(),遍历ArrayList集合。
(7)使用spliterator(),遍历ArrayList集合。
(8)使用stream(),把ArrayList转换为Stream,遍历ArrayList集合。
(9)使用sort(Comparator<?superE>c)排序,遍历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<GirlVo> 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<GirlVo> 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<GirlVo> list = getList();
// 2.遍历数据
for (GirlVo girlVo : list) {
System.out.println("girl信息: " + girlVo);
}
}
/**
* 1.4 使用ListIterator<E> listIterator(),遍历ArrayList集合
*/
public static void f1_4() {
// 1.获取数据
List<GirlVo> list = getList();
// 2.使用listIterator
ListIterator<GirlVo> iterator = list.listIterator();
// 3.使用Iterator遍历
while (iterator.hasNext()) {
System.out.println("遍历Iterator: " + iterator.next());
}
}
/**
* 1.5 使用ListIterator<E> listIterator(int index),按照指定位置开始,
* 遍历ArrayList集合
*/
public static void f1_5() {
// 1.获取数据
List<GirlVo> list = getList();
// 2.使用listIterator
ListIterator<GirlVo> 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<GirlVo> list = getList();
// 2.使用iterator
Iterator<GirlVo> 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<GirlVo> list = getList();
// 2.使用Spliterator
Spliterator<GirlVo> 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<GirlVo> list = getList();
// 2.ArrayList转换为
Stream<GirlVo> 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<GirlVo> 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<GirlVo> 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<GirlVo> 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<GirlVo> list = getList();
// 2.使用isEmpty
boolean bl = list.isEmpty();
System.out.println("List是否为空: " + bl);
}
/**
* 1.13使用contains(),判断ArrayList是否包含指定对象
*/
public static void f1_13() {
// 1.获取数据
List<GirlVo> 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<GirlVo> 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<GirlVo> 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<String> 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(Collection<?extendsE>c),把Collection添加到ArrayList。
(4)使用addAll(intindex,Collection<?extendsE>c),从指定index位置开始添加Collection集合,插入前在index位置及其后面的元素,会存放在插入的Collection后面。
3.2操作实例
操作实例,函数应用实例。
/**
* 2.1 使用add,在ArrayList尾部添加元素
*/
public static void f2_1() {
// 1.创建对象和创建元素
List<GirlVo> 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<String> 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<String> list = new ArrayList<>();
List<String> list01 = new ArrayList<>();
List<String> 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<String> list01 = new ArrayList<>();
List<String> 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<E>operator),修改ArrayList内部元素。
(4)使用Object[]toArray(),转换ArrayList为数组。
(5)使用<T>T[]toArray(T[]a),转换ArrayList为数组。
(6)使用for循环,修改ArrayList内部元素。
4.2操作实例
操作实例,函数应用实例。
/**
* 3.1 使用set(int index, E element),修改指定索引的元素
* 如果index位置在list中有元素,则把新元素占用这个位置.原来的元素就没有了.
*/
public static void f3_1() {
// 1.创建对象
List<String> 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<String> 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<String> list01 = list.subList(1, 3);
System.out.println("调用后遍历: ");
list01.forEach(girl -> {
System.out.println("girlVo信息: " + girl);
});
}
/**
* 3.3 使用replaceAll(UnaryOperator<E> operator),修改ArrayList内部元素
* JDK 1.8
*/
public static void f3_3() {
// 1.获取数据
List<GirlVo> 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<GirlVo> 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> T[] toArray(T[] a),转换ArrayList为数组
*/
public static void f3_5() {
// 1.获取数据
List<GirlVo> 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<GirlVo> 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(Predicate<?superE>filter),删除符合条件的元素。
(6)使用clear清空ArrayList。
5.2操作实例
操作实例,函数应用实例。
/**
* 4.1 使用remove(int index),删除指定位置元素
*/
public static void f4_1() {
// 1.创建对象
List<String> 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<String> 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<String> list = new ArrayList<>();
List<String> 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<String> list = new ArrayList<>();
List<String> 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<GirlVo> 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<String> 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<GirlVo>集合。
/**
* 获取List<GirlVo>集合
* */
public static List<GirlVo> getList() {
List<GirlVo> 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日