上午 3h LinkedList 深度学习1.1 LinkedList 底层结构与核心特点0.6h底层核心ArrayList底层动态可变数组LinkedList底层双向双向链表链表没有固定连续内存空间不存在数组扩容、元素移位问题核心特性元素以节点形式存储每个节点存数据 上一个节点地址 下一个节点地址无初始容量、无扩容机制元素按需创建节点首尾增删极快只需要修改节点引用地址根据索引查询、中间位置操作很慢必须从头 / 尾逐个遍历查找结构对比表必背表格集合底层结构查询 / 遍历中间增删首尾增删ArrayList动态数组极快慢慢LinkedList双向链表慢慢极快核心结论查多改少、展示列表、遍历数据 → 优先ArrayList频繁头尾增删、做队列 / 栈结构 → 优先LinkedList1.2 LinkedList 独有首尾专属方法1.2h继承 List 全部通用方法额外提供首尾操作专属 API适合链表结构。表格专属方法作用addFirst(E e)集合头部添加元素addLast(E e)集合尾部添加元素getFirst()获取第一个元素getLast()获取最后一个元素removeFirst()删除并返回首元素removeLast()删除并返回尾元素完整案例代码 逐行解析java运行import java.util.LinkedList; public class LinkedListFirstLastDemo { public static void main(String[] args) { // 1. 创建LinkedList集合泛型约束存储字符串 LinkedListString link new LinkedList(); // 2. 尾部添加等价普通add link.addLast(张三); link.addLast(李四); // 3. 头部添加 link.addFirst(赵六); System.out.println(首尾添加后 link); // 4. 获取首尾元素 String first link.getFirst(); String last link.getLast(); System.out.println(首元素 first); System.out.println(尾元素 last); // 5. 删除首尾元素 link.removeFirst(); link.removeLast(); System.out.println(删除首尾后 link); } }逐行解释LinkedListString link new LinkedList();创建双向链表集合仅允许存储字符串addFirst / addLast利用链表引用特性直接绑定头尾节点效率极高getFirst/getLast直接获取头尾节点无需遍历removeFirst/removeLast断开头尾节点引用自动回收节点无元素移位。1.3 LinkedList 通用 List 方法0.6h核心说明LinkedList实现了List接口满足 List 三大特性有序、可重复、带索引完全复用add()、remove(索引)、set()、get()、size()、clear()支持 Day14 全部三种遍历普通 for、增强 for、迭代器通用索引操作代码示例java运行import java.util.LinkedList; public class LinkedListCommonDemo { public static void main(String[] args) { LinkedListInteger list new LinkedList(); list.add(10); list.add(20); list.add(30); // 根据索引获取 System.out.println(索引1元素 list.get(1)); // 根据索引修改 list.set(0, 99); // 根据索引删除 list.remove(2); System.out.println(最终集合 list); } }关键短板LinkedList调用get(索引)时底层会从头节点循环遍历找位置数据量大时性能很差。1.4 适用场景总结0.6h适合场景频繁在头部、尾部插入 / 删除数据实现简单队列、栈、消息排队结构数据量波动大不想考虑数组扩容不适合场景大量根据索引查询、分页展示、列表遍历项目常规业务数据存储90% 场景用 ArrayList下午 2.5h 泛型 迭代器完整用法 增强 for 底层2.1 泛型 核心概念与作用1h1为什么需要泛型不写泛型集合默认存储Object类型什么类型都能存取出元素必须强制类型转换代码繁琐极易发生类型转换异常 ClassCastException2泛型核心三大作用类型约束规定集合只能存指定类型编译校验编译阶段就报错杜绝存错数据省去强转取出元素直接是目标类型简化代码3基础语法java运行集合存储类型 变量名 new 实现类();4无泛型 / 有泛型 对比完整代码① 无泛型弊端演示java运行import java.util.ArrayList; public class NoGenericDemo { public static void main(String[] args) { // 无泛型默认Object ArrayList list new ArrayList(); list.add(Java); list.add(123); // 乱存编译不报错 // 取出必须强转 String s (String) list.get(0); // String s2 (String) list.get(1); // 运行报错类型转换异常 } }② 有泛型安全规范写法java运行import java.util.ArrayList; public class GenericDemo { public static void main(String[] args) { // 泛型约束只能存String ArrayListString list new ArrayList(); list.add(Python); // list.add(666); 编译直接报错防止错误数据存入 // 无需强转直接取值 String str list.get(0); System.out.println(str); } }5泛型书写规则接口 / 类后加尖括号ListE、ArrayListE、LinkedListE泛型只能写引用类型String、Integer、自定义实体类基本类型不能写int不行要用包装类Integer2.2 迭代器 Iterator 完整用法0.8h1迭代器定位所有Collection单列集合通用遍历方式不依赖索引适配数组、链表所有集合遍历集合时安全删除元素唯一方案2三大核心方法iterator()调用集合方法获取迭代器对象hasNext()判断是否存在下一个未遍历元素返回布尔值next()获取下一个元素指针后移3标准默写模板 完整代码java运行import java.util.ArrayList; import java.util.Iterator; public class IteratorFullDemo { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(高数); list.add(英语); list.add(Java); // 1. 获取迭代器对象 IteratorString it list.iterator(); // 2. 循环判断是否有下一个元素 while (it.hasNext()){ // 3. 取出元素 String course it.next(); System.out.println(course); } } }逐行解析list.iterator()集合底层生成迭代器记录遍历起始位置it.hasNext()内部判断指针是否到达集合末尾it.next()取出当前元素同时迭代器指针向后移动一位。2.3 增强 for 循环底层原理0.7h1底层本质增强 for 循环底层完全就是迭代器是迭代器的简化写法简化代码、去掉迭代器对象书写2标准格式java运行for(元素类型 变量名 : 集合/数组){ 循环操作 }3代码演示java运行for (String s : list) { System.out.println(s); }4致命限制高频考点遍历过程中不能添加、删除集合元素会抛出ConcurrentModificationException 并发修改异常原因增强 for 底层迭代器不允许遍历期间修改集合长度解决方案需要增删必须用原生迭代器晚上 1.5h 综合练习 List 全复盘3.1 今日必做实战练习可直接抄写运行练习 1LinkedList 全套首尾操作java运行import java.util.LinkedList; public class LinkPractice { public static void main(String[] args) { LinkedListString link new LinkedList(); link.addFirst(元素1); link.addLast(元素2); link.addFirst(元素0); System.out.println(首元素 link.getFirst()); System.out.println(尾元素 link.getLast()); link.removeFirst(); link.removeLast(); System.out.println(link); } }练习 2三种方式遍历 LinkedListjava运行import java.util.Iterator; import java.util.LinkedList; public class LinkTraverse { public static void main(String[] args) { LinkedListInteger numList new LinkedList(); numList.add(1); numList.add(2); numList.add(3); // 1.普通for for (int i 0; i numList.size(); i) { System.out.print(numList.get(i) ); } System.out.println(\n--------); // 2.增强for for (Integer n : numList) { System.out.print(n ); } System.out.println(\n--------); // 3.迭代器 IteratorInteger it numList.iterator(); while (it.hasNext()){ System.out.print(it.next() ); } } }练习 3泛型安全对比自行对比无泛型随意存、有泛型限制类型的编译区别加深理解。3.2 高频面试简答直接背诵ArrayList 和 LinkedList 区别ArrayList底层数组查询遍历快中间增删慢LinkedList底层双向链表首尾增删快索引查询慢。泛型的作用约束集合存储类型编译期校验避免类型转换异常省略强制转换。增强 for 和迭代器关系增强 for 底层基于迭代器是简化写法本质完全一致。增强 for 为什么不能遍历删元素底层迭代器检测到集合长度被修改触发并发修改异常。3.3 Day20 核心知识点汇总LinkedList双向链表结构独有首尾 API适合头尾高频操作泛型统一类型、代码安全、简化转型操作迭代器集合通用遍历支持遍历中删除元素增强 for语法简化底层迭代器禁止遍历增删Day20 验收标准对照自查✅ 能口述 ArrayList / LinkedList 底层、优劣、使用场景✅ 熟练手写 LinkedList 首尾增删代码✅ 掌握泛型定义格式、作用、基本使用✅ 独立默写迭代器标准遍历代码✅ 理解增强 for 底层原理 并发修改异常原因关于ArrayList和LinkedList的区分一、先记两个终极比喻一辈子不忘ArrayList 电影院一排连坐的座位动态数组座位是连在一起的想找第 5 个人直接跳过去超快中间加人、减人后面所有人都要挪位置超慢LinkedList 幼儿园小朋友手拉手双向链表每个人只拉着前面和后面的人不占连续空间随便加人想找第 5 个人必须从第一个开始数很慢首尾加人、减人超级快只需要松手拉手二、最核心区别4 句话背会ArrayList 底层是动态数组LinkedList 底层是双向链表ArrayList查询快、增删慢LinkedList首尾增删快、查询慢三、详细对比一看就懂1. 结构区别ArrayList动态数组内存连续、挨着有索引直接跳转到任意位置满了会自动扩容 1.5 倍LinkedList双向链表内存不连续、分散每个元素存前一个人 自己 后一个人没有扩容来一个加一个2. 速度区别最重要表格操作ArrayList数组LinkedList链表原因随机查询get极快慢数组直接跳链表要从头数中间增删慢一般数组要挪位置链表只需改拉手首尾增删慢极快链表只需要松手、拉手3. 方法区别ArrayList 通用方法add、get、remove、set依靠索引LinkedList多了首尾专用方法addFirst()头加addLast()尾加getFirst()拿头getLast()拿尾removeFirst()删头removeLast()删尾这些方法ArrayList 没有四、开发中到底用谁90% 情况都用这个开发首选ArrayList因为业务中90% 都是查询、展示列表什么时候用 LinkedList做队列排队做栈先进后出频繁头插、尾插五、终极总结3 句背会ArrayList 连续数组 → 查询快、中间增删慢LinkedList 双向链表 → 首尾增删快、查询慢日常开发永远用 ArrayList特殊场景才用 LinkedList