Java中增强for循环和普通for循环的区别

首先普通for循环是能获取元素下标,并能通过下标遍历元素,而增强for却不可以获取下标,因此在遍历时的效率不同。

当为数组时,效率几乎是差不多的

当为集合时效率却大不同,当为ArrayLIst时,普通for的效率高于增强for

当为LInkedList时,增强for的效率高于普通for

验证代码:

package com.niuguwang.jihe;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;

public class CollectionTest {

	public static void main(String[] args) {
//		ArrayList listtest =new ArrayList<>();
//		LinkedList listtest =new LinkedList();
		person[] listtest =new person[5000000];
		for(int i=0;i<5000000;i++){
			listtest[i]= new person("xiaoming");
		}
/*		
		for(int i=0;i<5000000;i++){
			listtest.add(new person("xiaoming"));
		}
		
	*/	
		Object p=null;
		long start=System.currentTimeMillis();
		for(int i=0;i<listtest.length;i++){
			p=listtest[i];
		}
/*		
		for(int i=0;i<(listtest.size());i++){
			p = listtest.get(i);
		}
		*/
		
		System.out.println("普通for的耗用时间     "+(System.currentTimeMillis()-start));
		long start1=System.currentTimeMillis();
		for(Object o:listtest){
                        p=o;
                 }
		System.out.println("增强for的耗用时间     "+(System.currentTimeMillis()-start1));
	}
}
class person{
	String name;

	public person(String name) {
		super();
		this.name = name;
	}
	
}

其次集合中的元素动态删除时,增强for无法动态删除,而普通for可以动态删除。在增强for动态删除时会报一个 java.util.ConcurrentModificationException的错误,而普通for却没有这个问题,但是每删除一个元素时,集合的size会发生变化,删除会有遗漏,所以建议使用迭代器Iterator对集合进行动态删除操作。

在next()方法中有一个checkForComodification()方法,其实现为:

    final void checkForComodification() 
    {
         if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }

  可以看到,该函数是用来判断集合的修改次数是否合法。

  在集合内部维护一个字段modCount用于记录集合被修改的次数,每当集合内部结构发生变化(add,remove,set)时,modCount+1。

  在迭代器内部也维护一个字段expectedModCount,同样记录当前集合修改的次数,初始化为集合的modCount值。当我们在调用Iterator进行遍历操作时,如果有其他线程修改list会出现modCount!=expectedModCount的情况,就会报并发修改异常java.util.ConcurrentModificationException。

而使用迭代器删除时在执行remove操作时,同样先执行checkForComodification(),然后会执行ArrayList的remove()方法,该方法会将modCount值加1,这里我们将expectedModCount=modCount,使之保持统一。



有参考博客https://blog.csdn.net/u010911386/article/details/52711519


  • 1
    点赞
  • 3
    评论
  • 8
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值