Bootstrap

黑马java学习笔记14(阶段二 第四章4-3 99~4-4)

以下学习笔记记录于:2024.10.04-2024.10.08

阶段二 JavaSE进阶

第四章 集合框架

4-3 Set系列集合

99 LinkedHashSet集合

image-20241004222529490

100 TreeSet集合

image-20241004223050115

TreeSet排序方法需回顾“笔记10 阶段二 第二章 2-4 64-65”的内容

image-20241004225556514

image-20241004225532529

image-20241008101505396

4-4 集合的小知识

101 Collection系列集合小结

image-20241008104606183

102 注意事项:集合的并发修改异常问题

image-20241008110028506

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 前置知识:可变参数

image-20241011193617634

image-20241011193834014

104 集合的工具类:Collections

image-20241011194054140

public static void shuffle(List<?> list):打乱List集合中的元素顺序。 ——> 可用于斗地主洗牌

image-20241011195220132

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);
    }
}
;