Java 集合高级(二)单列集合三种通用遍历方式与迭代器底层源码
前言上一篇我们讲解了集合整体架构、Collection 顶层接口基础 API本篇学习所有单列集合通用的三种遍历方式迭代器、增强 for 循环、forEach 方法同时拆解迭代器底层源码搞懂指针移动原理。一、前置区分哪些集合能用通用遍历List 接口有索引除通用三种遍历外还支持普通 for 循环Set 接口无索引只能使用本篇三种通用遍历单列集合全部实现 Iterable 接口所以都支持迭代器遍历。二、方式 1迭代器 Iterator 遍历1. 迭代器核心两个方法方法作用boolean hasNext()判断集合是否还有未取出元素有返回 true无返回 falseE next()取出当前指针指向的元素同时指针自动后移一位2. 基础代码示例import java.util.ArrayList; import java.util.Iterator; public class IteratorDemo { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(拿); list.add(了); list.add(橘); list.add(子); list.add(跑); list.add(啊); // 1. 获取迭代器对象 IteratorString it list.iterator(); // 2. while循环判断是否有下一个元素 while(it.hasNext()){ // 取出元素指针后移 String s it.next(); System.out.println(s); } } }重要注意点循环中next()方法只调用一次多次调用会出现元素跳跃、NoSuchElementException 异常。3. ArrayList 迭代器底层源码解析private class Itr implements IteratorE { int cursor; // 指针记录当前待取元素下标 int lastRet -1; // 判断是否还有元素 public boolean hasNext() { return cursor ! size; } // 取出元素指针1 public E next() { int i cursor; cursor i 1; return (E) elementData[lastRet i]; } }运行逻辑cursor 初始值 0size 为集合总元素数量hasNext()判断 cursor 是否等于 size不等代表还有元素next()先保存当前 cursor 下标cursor 自增 1再取出数组对应下标元素返回当 cursor 等于 size 时hasNext()返回 false循环结束。迭代器小结IteratorString it 集合对象.iterator(); while(it.hasNext()) { String s it.next(); System.out.println(s); }hasNext()判断剩余元素next()取元素 指针后移禁止循环内多次调用 next ()三、方式 2增强 for 循环JDK5 推出1. 底层本质内部依旧封装 Iterator 迭代器简化迭代器代码书写仅用于遍历集合 / 数组无法在遍历过程中修改集合。2. 语法格式for (元素数据类型 变量名 : 集合/数组) { // 使用变量 }3. 代码演示import java.util.ArrayList; public class ForEachDemo { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(张三); list.add(李四); list.add(王五); // 增强for遍历 for (String s : list) { System.out.println(s); } } }四、方式 3forEach 遍历方法JDK81. 方法定义Collection 接口默认方法default void forEach(Consumer? super T action)接收函数式接口 Consumer遍历每个元素执行自定义操作。2. Lambda 写法import java.util.ArrayList; public class ForEachMethodDemo { public static void main(String[] args) { ArrayListString list new ArrayList(); list.add(苹果); list.add(香蕉); list.add(葡萄); // lambda表达式 list.forEach(s - System.out.println(s)); } }五、本篇统一小结单列集合通用三种遍历迭代器 Iterator、增强 for 循环、forEach 方法Set 无索引只能用这三种List 额外支持普通 for、ListIterator迭代器依靠 cursor 指针遍历hasNext 判断、next 取值并移动指针增强 for 底层是迭代器语法最简仅做遍历forEach 是 JDK8 函数式遍历配合 Lambda 简化代码遍历集合时不要多次调用 next ()避免异常。