首页 > 基础资料 博客日记
【Java基础教程】(二十二)Java新特性篇 · 第二讲:foreach循环——概念及优缺点、使用方式及应用场景~
2023-08-21 17:10:49基础资料围观217次
Java基础教程之新特性 · foreach循环
1️⃣ 概念
Java的 foreach 特性最初出现在JDK 1.5中,也被称为“增强的for循环”。它的设计目的是提供一种简洁、易读的语法,用于遍历集合或数组中的元素,减少了传统 for循环的冗余代码和错误机会。
简单来说,foreach是一种迭代器模式的变体,它允许我们以简单且直观的方式遍历一个集合或数组中的元素,并对每个元素执行相应的操作。foreach语句使用起来更加直观,使代码更易于理解和维护。
下面先来回顾一下传统数组输出的操作形式。
// 范例 1: 数组输出
package com.xiaoshan.demo;
public class TestDemo{
public static void main(String args[]){
int data[] = new int[]{1,2,3,4,5};
for (int x=0; x<data.length; x++){
System.out.print(data[x] + "、");
}
}
}
程序执行结果:
1、2、3、4、5、
在传统的数组输出操作中,往往会使用 for 循环来控制索引的下标,从而实现数据的输出操作。但一部分开发者会认为这样的输出方式需要控制索引,过于麻烦,更希望能够简化一些。所以从 JDK 1.5开始对于for 循环有了以下形式:
for (element_type element : collection) {
// 在此处执行针对 element 的操作
}
语法中,element_type
是集合或数组中元素的类型, element
表示在每次循环迭代时访问的元素,collection
则表示要遍历的数组或集合,在每一次循环时会自动的将数组的内容设置给变量。此时的 for 循环操作在每次循环时会自动将当前数组(或集合)的内容依次取出,这样就可以避免索引问题。
// 范例 2: 利用foreach循环实现输出
package com.xiaoshan.demo;
public class TestDemo {
public static void main(Stringl args[]){
int data[] = new int[]{1,2,3,4,5}; //定义数组
for (int x : data){ //循环次数由数组长度决定
//每一次循环实际上都表示数组的角标增长,会取得每一个数组的内容,并且将其设置给x
System.out.println( x + "、"); //x 就是每一个数组元素的内容
}
}
}
程序执行结果:
1、2、3、4、5、
2️⃣ 优势和缺点
优点:
- 语法简洁:foreach提供了一种紧凑的语法,减少了传统for循环的代码量;
- 避免了索引越界错误:foreach内部使用迭代器实现,能够自动处理集合或数组的边界情况,避免了常见的越界错误;
- 提高可读性:foreach语法可读性高,更符合自然语言描述集合遍历的过程。
缺点:
- 无法修改集合/数组长度:由于foreach底层使用迭代器,无法在遍历过程中修改集合或数组的长度;
- 无法获取当前元素的索引:foreach循环中无法直接访问当前元素的索引,需要通过其他方式解决。
3️⃣ 使用及应用场景
-
遍历数组:
// 范例 3: foreach 遍历数组 package com.xiaoshan.demo; public class TestDemo { public static void main(String args[]){ int[] numbers = {1, 2, 3, 4, 5}; for(int number : numbers) { System.out.println(number); } } }
-
遍历集合:
// 范例 4: foreach 遍历集合 package com.xiaoshan.demo; public class TestDemo { public static void main(String args[]){ List<String> fruits = Arrays.asList("apple", "banana", "cherry"); for (String fruit : fruits) { System.out.println(fruit); } } }
-
遍历自定义类型集合:
// 范例 5: foreach 遍历自定义类型集合 package com.xiaoshan.demo; class Person { String name; public Person(String name){ this.name = name; } // getter和setter等代码省略 } public class TestDemo { public static void main(String args[]){ List<Person> people = new ArrayList<>(); // 添加Person对象到people集合 people.add(new Person("张三")); people.add(new Person("王五")); for (Person person : people) { System.out.println(person.getName()); } } }
-
使用带有索引的foreach循环:
// 范例 6: 带有索引的foreach 遍历 package com.xiaoshan.demo; public class TestDemo { public static void main(String args[]){ String[] fruits = {"apple", "banana", "cherry"}; int index = 0; for (String fruit : fruits) { System.out.println(index + ": " + fruit); index++; } } }
需要注意的是,范例6是通过借助 index
变量,手动维护索引计数。
从以上案例可以发现,foreach
适用于各种遍历集合或数组的场景,特别是当我们只需要访问元素而不修改集合时,foreach提供了一种简洁的方式。
常见的应用场景主要包括:
- 遍历集合进行数据处理、过滤或打印。
- 对数组执行元素计数、求和等操作。
- 针对自定义类型集合进行持久化、转换等处理。
而在使用foreach循环时,需要注意的是,foreach 循环中不能修改集合/数组的长度,否则会抛出 ConcurrentModificationException
并发修改异常。如果需要同时访问索引和元素,可以通过其他方式实现(如使用额外的计数器变量)。
🌾 总结
本文中,我们详细介绍了Java的 foreach特性,从它的起源、概念,到优缺点、特征和基础语法进行了全面讲解。我们还提供了丰富的代码案例来演示其使用技巧,并探讨了foreach的应用场景和注意事项。
通过合理地运用foreach特性,能够使代码更加简洁、易读,并且避免常见的错误。在日常开发中,我们建议熟练掌握foreach的用法,以便更高效地处理集合或数组的遍历操作。
⏪ 温习回顾上一篇(点击跳转): 《【Java基础教程】(二十一)Java新特性篇 · 第一讲:可变参数——概念及优缺点、特征及应用场景、使用技巧、构建动态日志工具实践~》
⏩
继续阅读下一篇(点击跳转):
《【Java基础教程】(二十三)Java新特性篇 · 第三讲:泛型 Generics——泛型使用方式、通配符、类型擦除机制,对协变和逆变的支持 ~》
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: