增强for循环 -- foreach循环

1  作用

  简化迭代器的书写格式。(注意:foreach循环的底层还是使用了迭代器遍历。)

2  适用范围

  如果是实现了Iterable接口的对象或者是数组对象都可以使用foreach循环。

3  格式

  for(数据类型 变量名 :遍历的目标){

  }

示例:

1 public static void main(String[] args) {
2     HashSet<String> set = new HashSet<>();
3     set.add("张三");
4     set.add("李四");
5     set.add("王五");
6
7 }

若想遍历这个集合,可以用迭代器

1 //使用迭代器遍历集合
2 Iterator it = set.iterator();
3 while(it.hasNext()){
4     System.out.println("集合的元素为: " + it.next());
5 }

有没有更简洁的办法呢?可以用foreach循环

1 for(String it : set){
2     System.out.println("集合的元素:" + it);
3 }

这个循环应该读作 -- “循环set中的每一个元素”(for each element in set)

4  foreach循环的优点在于:相比普通for循环来更加简洁,更加不容易出错(不必为数组下标的起始值和终止值担心)

5  foreach循环应该注意的事项:

(1). foreach循环底层也是使用了迭代器获取的,只不过获取迭代器由jvm完成,不需要我们获取迭代器而已,所以在使用foreach循环变量元素的过程中不准使用集合对象对集合的元素个数进行修改。

也就是说:

1 for(String it : set){
2     System.out.println("集合的元素:" + it);
3     set.remove("it");
4 }

上面这个调用remove方法是错误的!

(2). 普通for循环与foreach循环的区别:普通for循环可以没有变量的目标,而foreach循环一定要有变量的目标。

6  缺点:在对数组索引进行操作或者集合进行增删操作时,显得力不从心,此时不建议使用foreach循环

回顾第二点,它的使用范围,如果现在有一个Map集合,怎么对它使用foreach循环?

  通过查看API文档可得知,Map集合没有实现Iterable接口,所以Map集合不能直接使用foreach循环

  

  但是它有一个entrySet方法(Map的迭代方法),它的返回类型是Set<Map.Entry<K,V>>

  

  我们知道Set接口下是实现了Iterable接口的:

  

所以我们可以这样:

1 HashMap<String, String> map = new HashMap<String, String>();
2     map.put("001","张三");
3     map.put("002","李四");
4     map.put("003","王五");
5     map.put("004","赵六");
6     Set<Map.Entry<String, String>> entrys = map.entrySet();
7     for(Map.Entry<String, String> entry  : entrys){
8         System.out.println("键:"+ entry.getKey()+" 值:"+ entry.getValue());
9     }

最后的建议:若没有其他操作,单单遍历循环,能用foreach循环就用这个

最后的最后:这是JDK1.5时才存在的!

时间: 2024-10-27 19:42:37

增强for循环 -- foreach循环的相关文章

for循环,for…in循环,forEach循环的区别

for循环,for…in循环,forEach循环的区别for循环通关for循环,生成所有的索引下标for(var i = 0 ; i <= arr.length-1 ; i++){ 程序内容 }来执行循环. forEach循环数组.forEach(function(形参1,形参2,形参3){})形参1: 存储的是当前循环次数时,获取的单元数据形参2.储存的是当前循环次数时,获取的单元索引下标形参3.储存的是原始数组三个参数不一定全部定义,看实际项目要求forEach() 只能循环遍历数组,不能循

for循环,for...in循环,forEach循环的区别

for循环 是应用最广泛的循环形式,适用于已知循环次数,循环嵌套情况 循环逻辑: 1. 定义循环变量并且赋值初始值 2. 判断是否符合进入循环的条件 3. 执行循环体 4. 执行步长 注:1 - 4步为循环执行 基本语法: for...in循环 for-in循环实际是为循环”enumerable“对象而设计的 例: forEach循环 从ES5开始 Javascript内置了forEach方法 用来遍历数组基本语法: 形参1:存储数组单元的数据 形参2:存储数组单元的索引下标 形参3:存储原始数

foreach循环里不能remove/add元素的原理

foreach循环 ? ?? foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素.Java语言从JDK 1.5.0开始引入foreach循环.在遍历数组.集合方面,foreach为开发人员提供了极大的方便.通常也被称之为增强for循环. ? ?? 在日常开发中,foreach循环用的非常多,但是有一点要非常小心,就是不能在这个循环里对数组或者集合里的元素进行remove或者add操作,否则会抛出java.util.Concurr

为什么阿里禁止在 foreach 循环里进行元素的 remove/add 操作

在阿里巴巴Java开发手册中,有这样一条规定:但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考.1.foreach循环foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素.Java语言从JDK 1.5.0开始引入foreach循环.在遍历数组.集合方面,foreach为开发人员提供了极大的方便.通常也被称之为增强for循环.foreach 语法格式如下: for(元素类型t 元素变量x : 遍历对象obj){ 引

为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作

这个问题我在实际写代码中也遇到过,当时还很疑惑,刚看到这里有一些解释得挺清楚,记录一下: 原文地址为:https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid=2650123395&idx=1&sn=b089eac4f561f58ee8a92602db17f577&chksm=f36bb1a2c41c38b4f36c1a84f205e188a6a8aa2684f316e4dcb8d1162b6e94b970c670b2e5b

PHP的for循环和foreach循环

PHP中的for循环 <?php $arr = array("a", "b", "c"); for( $i = 0; $i < count($arr); $i++){ echo $arr[$i]; }; // count 相当于js中的 length ?> 优化一下 <?php $arr = array("a", "b", "c", 'd'); $num = co

For-Each循环~增强for循环

某人问我增强for循环是什么,其实我只是会用,所以上网查了一下,如下: For-Each循环 For-Each循环也叫增强型的for循环,或者叫foreach循环. For-Each循环是JDK5.0的新特性(其他新特性比如泛型.自动装箱等). For-Each循环的加入简化了集合的遍历. 其语法如下: for(type 变量名: array) {       System.out.println(变量名); } 例子 其基本使用可以直接看代码: 代码中首先对比了两种for循环:之后实现了用增强

Java中的增强 for 循环 foreach

foreach 是 Java 中的一种语法糖,几乎每一种语言都有一些这样的语法糖来方便程序员进行开发,编译期间以特定的字节码或特定的方式来对这些语法进行处理.能够提高性能,并减少代码出错的几率.在 Java 中还有比如 泛型.自动拆箱.自动装箱.内部类.枚举等等. foreach 是用来对数组或者集合进行遍历的语法.具体语法如下: 1 2 3 for(元素类型 ele : 数组名/Iterable 实例){   } 下面我们用 foreach 来对数组和一个集合进行遍历: 1 2 3 4 5 6

从字节码看Java中for-each循环(增强for循环)实现原理

转发:http://blog.csdn.net/u011392897/article/details/54562596 for-each循环是jdk1.5引入的新的语法功能.并不是所有东西都可以使用这个循环的.可以看下Iterable接口的注释,它说明了除了数组外,其他类想要使用for-each循环必须实现这个接口.这一点表明除了数组外的for-each可能底层是由迭代器实现的. Iterable接口在1.8之前只有一个方法,Iterator<T> iterator(),此方法返回一个迭代器.