Java中Iterator用法整理

本文深入讲解了Java中的迭代器(Iterator)设计模式,包括其基本功能、使用方法及ListIterator的增强特性。通过实例展示了如何利用迭代器遍历集合元素,适用于初学者和进阶开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器(Iterator)

  迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

  Java中的Iterator功能比较简单,并且只能单向移动:

  (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

  (2) 使用next()获得序列中的下一个元素。

  (3) 使用hasNext()检查序列中是否还有元素。

  (4) 使用remove()将迭代器新返回的元素删除。

  Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

 

迭代器应用:

复制代码

 list l = new ArrayList();
 l.add("aa");
 l.add("bb");
 l.add("cc");
 for (Iterator iter = l.iterator(); iter.hasNext();) {
     String str = (String)iter.next();
     System.out.println(str);
 }
 /*迭代器用于while循环
 Iterator iter = l.iterator();
 while(iter.hasNext()){
     String str = (String) iter.next();
     System.out.println(str);
 }
 */

复制代码

 

 

Iterator的接口定义:

 

public interface Iterator {  
  boolean hasNext();  
  Object next();  
  void remove();  
}  

 

使用: Object next():返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型

    boolean hasNext():判断容器内是否还有可供访问的元素

    void remove():删除迭代器刚越过的元素

迭代使用方法:(迭代其实可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类)

for(Iterator it = c.iterator(); it.hasNext(); ) {  
  Object o = it.next();  
   //do something  
}  
原文地址:https://www.cnblogs.com/lxqiaoyixuan/p/7156944.html
<think>我们正在整理关于Java中foreach循环的笔记。根据用户要求,需要总结用法及示例。参考已有的引用内容:引用[1]展示了使用forEach方法遍历数组的示例(注意:这里是数组使用了forEach方法,但数组本身没有forEach方法,这是通过StreamAPI或Arrays类实现的?实际上,在Java中,数组没有直接的forEach方法,但可以通过Arrays.stream或List的forEach来实现。不过用户给的例子是:String[]names={...};names.forEach(...);这在Java8及以上是可行的吗?实际上,数组并没有forEach方法,这个例子可能是错误的?)但根据引用[2]:foreach循环是Java中用于遍历数组和集合的一种简洁语法。这里指的应该是增强for循环(enhancedforloop),而不是集合的forEach方法。因此,我们需要区分:1.增强for循环(语法:for(Typevar:iterable){...}),可以用于数组和实现了Iterable接口的集合。2.从Java8开始引入的forEach方法(属于Iterable接口和StreamAPI),它接受一个Consumer参数。用户问题中提到了“foreach”,可能同时指代这两种。但根据引用[2]的描述,它主要指的是增强for循环,但也提到了集合的forEach方法。因此,我们总结应包括:第一部分:增强for循环(传统foreach循环)1.1数组遍历1.2集合遍历(List,Set等)第二部分:Java8的forEach方法(使用lambda表达式)2.1集合的forEach方法2.2数组如何通过Arrays.stream或Stream.of使用forEach注意:用户示例中有一个数组直接调用forEach,这在Java中是不允许的(数组没有forEach方法)。所以引用[1]的示例可能是错误的?实际上,在Java中,数组可以使用增强for循环,但不能直接调用forEach方法。但是,我们可以通过Arrays.stream(arr).forEach()或使用List的forEach(如果转换为List的话)来实现。然而,查看引用[1]的示例代码:String[]names={"Alice","Bob","Charlie"};names.forEach(name->System.out.println(name));这个代码在Java中是无法编译的,因为数组类型没有forEach方法。所以,正确的做法应该是:Arrays.stream(names).forEach(name->System.out.println(name));或者List<String>list=Arrays.asList(names);list.forEach(name->System.out.println(name));但是,引用[1]的示例可能是有误的。不过,用户已经看到这个引用,我们需要在回答中澄清。因此,在总结中,我们应指出:-增强for循环可以直接用于数组和集合。-集合类(List,Set等)有forEach方法(从Java8开始)。-数组没有forEach方法,但可以通过Arrays.stream或转换为集合来使用forEach。根据以上分析,我们来组织回答。</think>### Java foreach 用法总结及示例 #### 一、增强 for 循环(传统 foreach) 用于遍历数组和实现了 `Iterable` 接口的集合(如 List、Set),语法简洁无需索引控制。 **语法结构**: ```java for(元素类型 变量名 : 集合/数组) { // 操作代码 } ``` **示例代码**: ```java // 遍历数组 String[] languages = {"Java", "Python", "C++"}; for (String lang : languages) { System.out.println(lang); } // 遍历List List<Integer> numbers = List.of(1, 2, 3); for (int num : numbers) { System.out.println(num * 2); } // 遍历Set Set<String> colors = new HashSet<>(Arrays.asList("Red", "Green")); for (String color : colors) { System.out.println(color.toUpperCase()); } ``` **特点**: - 自动处理迭代过程 - 避免 `IndexOutOfBoundsException` 风险 - 不可修改集合结构(增删元素会抛 `ConcurrentModificationException`) #### 二、Java 8 的 forEach() 方法 基于函数式编程,通过 Lambda 表达式或方法引用实现遍历。 **语法结构**: ```java 集合.forEach(consumer) ``` **示例代码**: ```java // List遍历 List<String> fruits = Arrays.asList("Apple", "Banana"); fruits.forEach(fruit -> System.out.println(fruit)); // Lambda // Set遍历(使用方法引用) Set<Integer> ids = Set.of(101, 102); ids.forEach(System.out::println); // 方法引用 // Map遍历 Map<String, Integer> map = Map.of("A", 90, "B", 85); map.forEach((key, value) -> System.out.println(key + ":" + value) ); ``` **数组的特殊处理**: 数组需先转换为流才能使用 forEach: ```java String[] names = {"Alice", "Bob", "Charlie"}; Arrays.stream(names).forEach(System.out::println); // 正确用法 // names.forEach(...) ❌ 数组不能直接调用 forEach ``` **特点**: - 支持 Lambda 表达式和方法引用 - 可并行处理(`parallelStream().forEach()`) - 遍历时修改集合仍会抛异常 --- ### 对比总结 | **特性** | 增强 for 循环 | forEach() 方法 | |-----------------------|--------------|---------------| | 语法简洁度 | ★★★★ | ★★★★☆ | | 支持 Lambda | ❌ | ✔️ | | 数组直接支持 | ✔️ | ❌(需转换流) | | 并行处理能力 | ❌ | ✔️ | | 遍历中修改集合 | 抛异常 | 抛异常 | | 方法引用支持 | ❌ | ✔️ | > **最佳实践**: > - 简单遍历 → 增强 for 循环 > - 函数式处理 → forEach() + Lambda > - 大型数据并行处理 → `parallelStream().forEach()` > - 遍历时修改集合 → 使用 `Iterator` 显式迭代 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值