我是靠谱客的博主 义气犀牛,最近开发中收集的这篇文章主要介绍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


最后

以上就是义气犀牛为你收集整理的Java中增强for循环和普通for循环的区别的全部内容,希望文章能够帮你解决Java中增强for循环和普通for循环的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部