以下学习笔记记录于:2024.10.04-2024.10.08
文章目录
阶段二 JavaSE进阶
第四章 集合框架
4-3 Set系列集合
99 LinkedHashSet集合
100 TreeSet集合
TreeSet排序方法需回顾“笔记10 阶段二 第二章 2-4 64-65”的内容
4-4 集合的小知识
101 Collection系列集合小结
102 注意事项:集合的并发修改异常问题
CollectionTest1.java:
package com.itheima.hello.d5_collection_exception;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CollectionTest1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("王麻子");
list.add("小李子");
list.add("李爱华");
list.add("张全蛋");
list.add("晓李");
list.add("李大刚");
System.out.println(list);
// 需求:找出集合中全部带“李”的名字,并从集合中删除
// 错误做法:出现集合并发修改异常错误(在删除name之后,集合内容往前移,而it指向了下一个元素,进而导致错误发生)
// 用迭代器遍历ArrayList集合(有索引)
// Iterator<String> it = list.iterator();
// while (it.hasNext()){
// String name = it.next();
// if (name.contains("李")){
// list.remove(name);
// }
// }
// System.out.println(list); // 报错
//
// // 用for循环遍历ArrayList集合(有索引)
// for (int i = 0; i < list.size(); i++) {
// String name = list.get(i);
// if (name.contains("李")){
// list.remove(name);
// }
// }
// System.out.println(list); // 输出[王麻子,李爱华,张全蛋,李大刚]
//
// // 使用增强for循环遍历(相当于迭代器遍历集合的简化写法),因为拿不到迭代器,所以会报错
// for (String name : list) {
// if (name.contains("李")){
// list.remove(name);
// }
// }
// System.out.println(list); // 报错
//
// // 用foreach遍历(相当于增强for,点击查看源码即可看到)
// list.forEach(name -> {
// if (name.contains("李")){
// list.remove(name);
// }
// });
// System.out.println(list); // 报错
System.out.println("--------------------------------------------");
// 正确做法:1、用for循环顺着遍历并i--,或者倒着遍历进行删除;2、用迭代器自己的删除方法
for (int i = 0; i < list.size(); i++) {
String name = list.get(i);
if (name.contains("李")){
list.remove(name);
i--;
}
}
System.out.println(list); // 输出[王麻子、张全蛋]
Iterator<String> it = list.iterator();
while (it.hasNext()){
String name = it.next();
if (name.contains("李")){
it.remove(); // 删除迭代器当前遍历到的数据,每删除一个数据后,相当于也在底层做了i--
}
}
System.out.println(list); // 输出[王麻子、张全蛋]
}
}
103 前置知识:可变参数
104 集合的工具类:Collections
public static void shuffle(List<?> list):打乱List集合中的元素顺序。 ——> 可用于斗地主洗牌
CollectionsTest1.java:
_package com.itheima.hello.d2_collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
// 目标:掌握Collections集合工具类的使用
public class CollectionsTest1 {
public static void main(String[] args) {
// 1、public static <T> boolean addAll(Collection<? super T> C, T...element): 为集合批量添加数据
List<String> names = new ArrayList<>();
Collections.addAll(names, "张三", "李四", "王五", "赵六");
System.out.println(names);
// 2、public static void shuffle(List<?> list):打乱List集合中的元素顺序。 ——> 可用于斗地主洗牌
Collections.shuffle(names);
System.out.println(names);
// 3、public static <T> void sort(List<T> list):对List集合中的元素进行升序排序。
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(5);
list.add(2);
Collections.sort(list);
System.out.println(list);
List<Student> students = new ArrayList<>();
students.add(new Student("蜘蛛精", 23, 169.5));
students.add(new Student("紫霞仙子", 18, 165.0));
students.add(new Student("紫霞仙子", 18, 165.0));
students.add(new Student("至尊宝", 25, 189.5));
Collections.sort(students);
System.out.println("按照年龄排序:" + students);
// 4、public static <T> void sort(List<T> list, Comparator<? super T> c): 对List集合中元素,按照比较器对象指定的规则进行排序
// 可用Lambda表达式简化
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return Double.compare(o1.getHeight(), o2.getHeight());
}
});
System.out.println("按照身高排序:" + students);
}
}