Java 中的迭代器Iterator是一种设计模式用于遍历集合中的元素而不需要暴露集合的内部结构。它是 Java 集合框架的核心组件之一。基本概念Iterator 接口Iterator是一个接口位于java.util包中提供了统一的方式来遍历各种集合。publicinterfaceIteratorE{booleanhasNext();// 判断是否还有下一个元素Enext();// 返回下一个元素defaultvoidremove(){}// 删除当前元素可选操作defaultvoidforEachRemaining(Consumer?superEaction){}// Java 8 新增}基本用法1.创建和使用迭代器ListStringnamesArrays.asList(张三,李四,王五);// 获取迭代器IteratorStringiteratornames.iterator();// 遍历元素while(iterator.hasNext()){Stringnameiterator.next();System.out.println(name);}2.for-each 循环语法糖ListStringnamesArrays.asList(张三,李四,王五);// for-each 循环内部使用迭代器for(Stringname:names){System.out.println(name);}// 等价于上面的 while 循环主要方法详解1.hasNext() 和 next()ListIntegernumbersArrays.asList(1,2,3,4,5);IteratorIntegeriteratornumbers.iterator();while(iterator.hasNext()){Integernumiterator.next();System.out.println(当前元素: num);System.out.println(是否还有下一个: iterator.hasNext());}2.remove() 方法ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五,赵六));IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(name.equals(李四)){iterator.remove();// 安全删除当前元素}}System.out.println(names);// [张三, 王五, 赵六]重要注意事项remove()必须在调用next()之后调用每次调用next()只能调用一次remove()不是所有集合都支持remove()操作3.forEachRemaining() 方法Java 8ListStringnamesArrays.asList(张三,李四,王五);IteratorStringiteratornames.iterator();// 先跳过第一个元素if(iterator.hasNext()){iterator.next();}// 处理剩余元素iterator.forEachRemaining(name-System.out.println(剩余: name));迭代器 vs 其他遍历方式1.传统 for 循环ListStringnamesArrays.asList(张三,李四,王五);// 传统 for 循环for(inti0;inames.size();i){Stringnamenames.get(i);System.out.println(name);}// 优点可以访问索引// 缺点代码冗长只适用于 List2.for-each 循环ListStringnamesArrays.asList(张三,李四,王五);// for-each 循环for(Stringname:names){System.out.println(name);}// 优点简洁适用于所有集合// 缺点无法在遍历中删除元素3.迭代器ListStringnamesArrays.asList(张三,李四,王五);// 迭代器IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(name.equals(李四)){iterator.remove();// 可以安全删除}}// 优点可以安全删除元素适用于所有集合// 缺点代码相对冗长ListIteratorListIterator是Iterator的子接口专门用于 List 集合提供了双向遍历功能。ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五));ListIteratorStringlistIteratornames.listIterator();// 正向遍历System.out.println(正向遍历:);while(listIterator.hasNext()){intindexlistIterator.nextIndex();StringnamelistIterator.next();System.out.println(index: name);}// 反向遍历System.out.println(反向遍历:);while(listIterator.hasPrevious()){intindexlistIterator.previousIndex();StringnamelistIterator.previous();System.out.println(index: name);}// 添加元素listIterator.add(新元素);// 修改元素if(listIterator.hasNext()){listIterator.next();listIterator.set(修改后的元素);}实际应用场景1.安全删除元素ListIntegernumbersnewArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));// 删除偶数IteratorIntegeriteratornumbers.iterator();while(iterator.hasNext()){Integernumiterator.next();if(num%20){iterator.remove();// 安全删除}}System.out.println(numbers);// [1, 3, 5, 7, 9]2.过滤集合ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五,赵六,钱七));// 删除名字长度为2的元素IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(name.length()2){iterator.remove();}}System.out.println(names);// [张三, 李四, 王五, 赵六, 钱七]假设都是2个字3.自定义迭代器publicclassRangeimplementsIterableInteger{privateintstart;privateintend;publicRange(intstart,intend){this.startstart;this.endend;}OverridepublicIteratorIntegeriterator(){returnnewIteratorInteger(){privateintcurrentstart;OverridepublicbooleanhasNext(){returncurrentend;}OverridepublicIntegernext(){if(!hasNext()){thrownewNoSuchElementException();}returncurrent;}};}}// 使用自定义迭代器RangerangenewRange(1,5);for(intnum:range){System.out.println(num);// 1, 2, 3, 4, 5}4.处理嵌套集合ListListStringnestedListArrays.asList(Arrays.asList(A,B,C),Arrays.asList(D,E),Arrays.asList(F,G,H,I));// 使用迭代器处理嵌套结构IteratorListStringouterIteratornestedList.iterator();while(outerIterator.hasNext()){ListStringinnerListouterIterator.next();IteratorStringinnerIteratorinnerList.iterator();while(innerIterator.hasNext()){StringelementinnerIterator.next();System.out.print(element );}System.out.println();}并发修改异常问题示例ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五));// 错误在遍历时直接修改集合for(Stringname:names){if(name.equals(李四)){names.remove(name);// ConcurrentModificationException}}正确做法ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五));// 正确使用迭代器删除IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(name.equals(李四)){iterator.remove();// 安全删除}}Java 8 的替代方案1.Stream APIListStringnamesnewArrayList(Arrays.asList(张三,李四,王五,赵六));// 使用 Stream 过滤ListStringfilterednames.stream().filter(name-!name.equals(李四)).collect(Collectors.toList());System.out.println(filtered);// [张三, 王五, 赵六]2.removeIf 方法ListStringnamesnewArrayList(Arrays.asList(张三,李四,王五,赵六));// 使用 removeIfnames.removeIf(name-name.equals(李四));System.out.println(names);// [张三, 王五, 赵六]3.forEach 方法ListStringnamesArrays.asList(张三,李四,王五);// 使用 forEachnames.forEach(name-System.out.println(name));// 使用方法引用names.forEach(System.out::println);性能考虑1.不同遍历方式的性能ListIntegerlargeListnewArrayList();for(inti0;i1000000;i){largeList.add(i);}// 传统 for 循环最快longstartSystem.currentTimeMillis();for(inti0;ilargeList.size();i){IntegernumlargeList.get(i);}System.out.println(传统 for: (System.currentTimeMillis()-start)ms);// 迭代器中等startSystem.currentTimeMillis();IteratorIntegeriteratorlargeList.iterator();while(iterator.hasNext()){Integernumiterator.next();}System.out.println(迭代器: (System.currentTimeMillis()-start)ms);// for-each与迭代器类似startSystem.currentTimeMillis();for(Integernum:largeList){// 使用 num}System.out.println(for-each: (System.currentTimeMillis()-start)ms);最佳实践✅ 推荐做法// 1. 简单遍历使用 for-eachListStringnamesArrays.asList(张三,李四,王五);for(Stringname:names){System.out.println(name);}// 2. 需要删除元素时使用迭代器IteratorStringiteratornames.iterator();while(iterator.hasNext()){Stringnameiterator.next();if(shouldRemove(name)){iterator.remove();}}// 3. Java 8 优先使用 Stream 或 removeIfnames.removeIf(name-shouldRemove(name));// 4. 需要索引时使用传统 for 循环for(inti0;inames.size();i){System.out.println(i: names.get(i));}❌ 避免的做法// 1. 避免在 for-each 中删除元素for(Stringname:names){names.remove(name);// ConcurrentModificationException}// 2. 避免多次调用 next() 而不检查 hasNext()IteratorStringiteratornames.iterator();Stringname1iterator.next();Stringname2iterator.next();// 可能抛出 NoSuchElementException// 3. 避免在不需要时使用迭代器// 简单遍历不需要迭代器的复杂性总结Java 迭代器的主要特点统一接口为所有集合提供统一的遍历方式安全删除可以在遍历过程中安全删除元素封装性不暴露集合的内部结构灵活性支持自定义迭代逻辑向后兼容支持旧版本的集合操作迭代器是 Java 集合框架的重要组件理解它有助于更好地处理集合遍历和修改操作。在现代 Java 中虽然 Stream API 提供了更强大的功能但迭代器仍然是处理某些场景的重要工具。