java 增强型for循环 详解

devtools/2024/11/22 16:17:28/

Java 增强型 for 循环(Enhanced for Loop)详解

增强型 for 循环(也称为 “for-each” 循环)是 Java 从 JDK 5 开始引入的一种便捷循环语法,旨在简化对数组或集合类的迭代操作。


1. 基本语法

语法格式

java">for (类型 变量 : 迭代对象) {// 循环体
}
  • 类型:迭代对象中元素的类型。
  • 变量:每次迭代时,存储当前元素的变量。
  • 迭代对象:数组或实现了 Iterable 接口的集合(如 ListSet 等)。

2. 使用示例

2.1 遍历数组

java">public class EnhancedForArray {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};for (int num : numbers) {System.out.println(num); // 输出:1, 2, 3, 4, 5}}
}

2.2 遍历集合

java">import java.util.ArrayList;
import java.util.List;public class EnhancedForList {public static void main(String[] args) {List<String> fruits = new ArrayList<>();fruits.add("Apple");fruits.add("Banana");fruits.add("Cherry");for (String fruit : fruits) {System.out.println(fruit); // 输出:Apple, Banana, Cherry}}
}

3. 特性与限制

3.1 特性

  1. 简洁性

    • 不需要手动管理索引或迭代器,代码更易读。
    • 对比传统 for 循环,不需要获取数组长度或调用集合的迭代器。
  2. 适用性广泛

    • 可用于数组、ListSetMap(遍历 entrySet()keySet()values())。

3.2 限制

  1. 无法修改集合结构

    • 增强型 for 循环中,不能直接对集合进行 addremove 操作,否则会抛出 ConcurrentModificationException

    • 示例:

      java">List<String> list = new ArrayList<>();
      list.add("A");
      list.add("B");for (String s : list) {if (s.equals("A")) {list.remove(s); // 会抛出异常}
      }
      
    • 如果需要修改集合结构,可以使用 迭代器

      java">Iterator<String> iterator = list.iterator();
      while (iterator.hasNext()) {String s = iterator.next();if (s.equals("A")) {iterator.remove(); // 安全地删除元素}
      }
      
  2. 无法访问索引

    • 增强型 for 循环中无法直接获取元素的索引。如果需要索引,需使用传统 for 循环:
      java">String[] fruits = {"Apple", "Banana", "Cherry"};
      for (int i = 0; i < fruits.length; i++) {System.out.println("Index " + i + ": " + fruits[i]);
      }
      
  3. 只支持顺序访问

    • 适用于 Iterable 接口的集合(如 ListSet),不适用于需要随机访问的场景。

4. 遍历 Map 的增强型 for

4.1 遍历 keySet

遍历 Map 的所有键:

java">import java.util.HashMap;
import java.util.Map;public class EnhancedForMap {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("A", 1);map.put("B", 2);map.put("C", 3);for (String key : map.keySet()) {System.out.println("Key: " + key + ", Value: " + map.get(key));}}
}

4.2 遍历 entrySet

更高效地同时遍历键和值:

java">for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

5. 适用场景

  1. 遍历数组

    • 对于大小已知且不需要修改的数组,增强型 for 是最佳选择。
  2. 遍历集合

    • 遍历 ListSet 等集合,尤其是当集合不需要修改时。
  3. 遍历 Map

    • 使用 entrySet() 时,增强型 for 简洁而高效。
  4. 简化代码

    • 避免手动管理索引或迭代器。

6. 常见问题

6.1 为什么增强型 for 循环不能修改集合?

增强型 for 底层使用了 迭代器 来遍历集合,如果直接修改集合结构(如添加或删除元素),会导致迭代器失效,抛出 ConcurrentModificationException

6.2 如何在增强型 for 中访问索引?

可以在增强型 for 中手动维护索引:

java">String[] fruits = {"Apple", "Banana", "Cherry"};
int index = 0;
for (String fruit : fruits) {System.out.println("Index " + index + ": " + fruit);index++;
}

7. 底层实现

增强型 for 循环的本质是使用了 迭代器 来实现的。

伪代码

对于 Iterable 对象:

java">for (Type element : collection) {Iterator<Type> it = collection.iterator();while (it.hasNext()) {Type element = it.next();// 循环体}
}

对于数组:

java">for (Type element : array) {for (int i = 0; i < array.length; i++) {Type element = array[i];// 循环体}
}

8. 总结

优点

  • 简化代码:适合大多数迭代场景,避免手动处理索引和迭代器。
  • 可读性高:语法简洁,专注于元素处理。

缺点

  • 不能直接操作索引。
  • 不支持修改集合结构。
  • 适用于顺序访问,不适合随机访问场景。

增强型 for 循环是 Java 中对迭代器模式的进一步抽象,它让遍历变得更加简单、高效,是开发中非常常用的工具。


http://www.ppmy.cn/devtools/136054.html

相关文章

基于python+django+vue.js开发的停车管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;车位管理、会员管理、停车场管理、违规管理、用户管理、日志管理、系统信息模块。 源码地址 https://github.com/geeeeeeeek/pytho…

分布式专题-Redis核心数据结构精讲

1. redis安装&#xff1a; redis.conf是redis启动配置文件&#xff1b; redis连接&#xff1a; 数据类型&#xff1a; redis命令&#xff1a; String类型&#xff1a; INCRBY orderId 1000 是 Redis 数据库中的一个命令&#xff0c;用于将存储在键 orderId 中的整数值增加 10…

庖丁解java(一篇文章学java)

(大家不用收藏这篇文章,因为这篇文章会经常更新,也就是删除后重发) 一篇文章学java,这是我滴一个执念... 当然,真一篇文章就写完java基础,java架构,java业务实现,java业务扩展,根本不可能.所以,这篇文章,就是一个索引,索什么呢? 请看下文... 关于决定开始写博文的介绍…

企业架构框架之银行业参考架构BIAN

本文从业务人员便于理解的角度来介绍 BIAN&#xff0c;与 BIAN 官方对其体系的解释有一定出入&#xff0c;仅供参考。 BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织&#xff0c;由全球领先银行、技术提供商、顾问和学者组成&#xff…

VUE:基于MVVN的前端js框架

文章目录 vue框架v-show vue框架 注意是 先写函数名&#xff0c;再写function。 handle:function (){}下面是错误的 function:handle(){}3 v-show 本质上等于号后面还是判断条件&#xff0c;所以不能写赋值语句&#xff0c;下面是正确的 下面是错误的 v-show " ge…

【第八课】Rust中的函数与方法

目录 前言 函数指针 函数当作另一个函数的参数 函数当作另一个函数的返回值 闭包 方法 关联函数 总结 前言 在前面几课中&#xff0c;我们都或多或少的接触到了rust中的函数&#xff0c;rust中的函数和其他语言的并没有什么不同&#xff0c;简单的语法不在这篇文章中赘…

11.21 小清新图论专场训练

小清新 A 怎么感觉不是很简单呢 分析一下发现操作的自由度是很高的&#xff0c;不妨认为 一个连通块内不需要考虑边的方向&#xff0c;只需考虑当前是否还有空位 空位的判定条件就是是否已经加出一个环了 int n , L ; int a[N] , b[N] ; int bin[N] ; bool vis[N] ; int F…

React-自定义Hook与逻辑共享

#题引&#xff1a;我认为跟着官方文档学习不会走歪路 在 React 中&#xff0c;自定义 Hook 是一种复用逻辑的方式。自定义 Hook 是一个 JavaScript 函数&#xff0c;名称以 use 开头&#xff0c;可以调用其他的 Hook, 可以返回任意值。 创建自定义Hook 假设你正在开发一款重…