尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Java 集合高级(二)单列集合三种通用遍历方式与迭代器底层源码

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 ()避免异常。
返回列表