【java】for和foreach的区别

本文探讨了Java中foreach循环的使用限制,包括其在集合遍历中的应用场景及局限性,尤其是在修改集合元素时的问题,并提供了详细的代码示例。

一、概述

       普通for循环在遍历集合时使用下标来定位集合中的元素。java在JDK1.5开始支持foreach循环,foreach在一定程度上简化了对集合的遍历。但某些情况下,foreach是不能完全代替for循环的。

       限制场景:

1、foreach适用于数组或实现了iterator的集合类。foreach就是使用Iterator接口来实现对集合的遍历的。

2、在用foreach循环遍历一个集合时,不能改变集合中的元素,如增加元素、修改元素。否则会抛出ConcurrentModificationException异常。想了解原因的可以研究一下源码

也不能修改集合中的元素(不报异常),但可以修改元素的属性。


二、验证之旅

(1)添加或移除元素

添加和移除是一样的,这里只给出了移除的代码。感兴趣的童鞋们可以自己试一试,毕竟纸上得来终觉浅嘛。


1、普通for循环进行添加或移除元素



         由输出结果可知,普通for循环,成功移除了元素“jingjing”。


2、foreach循环添加或移除元素



       由输出结果可知,foreach循环抛出ConcurrenModificationException异常。


(2)修改元素


1、普通for循环修改元素


         由输出结果可知,普通for循环成功将list集合中的每一个元素修改成“nini”


2、foreach循环修改元素



      由输出结果可知通过foreach方式并不能修改list中的元素


3、foreach循环修改元素的属性


首先声明一个学生类,代码如下:

package foreach;

public class Student {
     private int age;
     public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	private String name;
     public Student(){};
     public Student(int age,String name){
    	 this.age=age;
    	 this.name=name;
     }
} 
StudentTest类的测试代码如下:

  Student student=new Student(1,"beibei");
	   Student student1=new Student(1,"jingjing");
	   List<Student> studentList=new ArrayList<Student>();
	   studentList.add(student);
	   studentList.add(student1);
	   System.out.println(student); 
	   System.out.println(student1); 
	   System.out.println(student.getName()); 
	   System.out.println(student1.getName()); 
	   for(Student stu:studentList)
	    {
	  	   stu.setName("huanhuan");
	    }
	   System.out.println(student); 
	   System.out.println(student1);    
	   System.out.println(student.getName()); 
	   System.out.println(student1.getName()); 


最后的测试结果如下:


       由输出结果可知,student1和student2对象本身并没有改变,但他们的name属性发生了变化。


三、意外发现:

        验证之路似乎很完美,一切都和自己的预想结果相符,不过却总有意外的惊喜。


       1、list集合中的元素只有两条,使用foreach循环移除元素。


       


      2、list集合中的元素大于2个,对foreach循环加上try--catch。


    在这两种情况下,成功移除了元素。









09-09
### forEachJavaScript 中的使用 #### 基本概念 在 JavaScript 中,`forEach()` 方法专门用于对数组进行遍历。它需要一个函数作为参数,这个由用户定义但不由用户直接调用的函数被称为回调函数(callback),在 `forEach` 中,该回调函数会被调用多次,数组有几个元素,函数就调用几次。`forEach()` 通过回调函数将元素传递出来,元素信息以参数的形式传递进回调函数,可通过定义形参来获取元素信息 [^1]。 #### 回调函数参数 `forEach()` 的回调函数共有三个参数: 1. 当前被遍历的元素 2. 当前遍历的元素的索引 3. 当前正在被遍历的数组对象 示例代码如下: ```javascript let arr = ['孙悟空', '猪八戒', '沙尚', '唐僧']; arr.forEach(function (element, index, array) { console.log('element=', element); console.log('index=', index); console.log('array=', array); }); ``` #### 注意事项 - `forEach()` 遍历的范围在第一次调用回调函数前就会确定,调用 `forEach` 后添加到数组中的项不会被回调函数访问到 [^3]。 示例代码: ```javascript var arr = [1, 2, 3, 4, 5]; let count = 0; arr.forEach(function (item, index, arr) { count++; if (item === 2) { arr.push(8); } console.log(item); }); console.log('count的值' + count); console.log(arr); ``` - `forEach()` 对于空数组是不会执行回调函数的 [^4]。 #### 适用场景 `forEach` 适用于需要对数组中的每个元素执行相同操作的场景,例如打印数组元素信息、对数组元素进行简单的计算等。但它没有返回值,若使用 `console.log` 打印其返回结果,会得到 `undefined` [^2]。 示例代码: ```javascript const nums = [1, 2, 3]; const result = nums.forEach((num, index) => { console.log(`第${index + 1}个数是:${num}`); }); console.log(result); // undefined ``` ### JSTL 里的 foreach 标签使用 #### 基本概念 JSTL 里的 `foreach` 是一个循环标签,类似于 Java 里的 `for` 循环,里面的变量相当于一个局部变量,除了 `foreach` 标签范围就无法使用 [^5]。 #### 相关属性 - `item`:表示一个集合。 - `var`:表示每次遍历的对象。 - `varStatus`:表示遍历的状态,包含以下属性: - `current`:当前这次迭代的(集合)项。 - `index`:当前这次迭代从 0 开始的迭代索引。 - `count`:当前这次迭代从 1 开始的迭代计数。 - `first`:用来标明当前这轮迭代是否为第一次迭代的标志。 - `last`:用来标明当前这轮迭代是否为最后一次迭代的标志。 - `begin`:返回 `begin` 属性值。 - `end`:返回 `end` 属性值。 - `step`:返回 `step` 属性值。 #### 适用场景 JSTL 的 `foreach` 标签适用于在 JSP 页面中对集合进行遍历,将集合中的数据展示在页面上。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值