Java基础-foreach循环与for循环比较

循环:

普通for循环,while循环以及增强for循环的用途和区别:

while与for循环的区别:
1. while适合不知道执行次数的循环
2. for循环可以在内部初始化数值,适合已知次数的循环
相同的意思分别用while循环和for循环进行表示:

//for循环
for(int i = 0; i < n; i++){
     //执行操作
}

//while
int i = 0;
while(i < n){
    //执行操作
    i++;
}

可以看出用for循环结构更加清晰,意思更加明了

关于增强for循环

首先测试一下普通for循环和增强for循环的遍历速度

/**
 * 测试循环遍历的速率
 * @author shui
 *
 */
public class MainText {
    public static void main(String[] args) {
         ArrayList<Integer> list = new ArrayList();
         for(int i = 0; i < 50000; i++){
             list.add(12);
         }
         long start = System.currentTimeMillis();
         for(int i = 0; i < 50000; i++){
             list.get(i);
         }
         long end = System.currentTimeMillis();
         System.out.println("普通for循环使用了:" + (end - start) + "毫秒");
         start = System.currentTimeMillis();
         for(Integer i:list){
         }
         end = System.currentTimeMillis();
         System.out.println("增强for循环使用了:" + (end - start) + "毫秒");
    }
}

识别结果:
时间比较

# 增强for和 itrator的比较

首先,将增强for循环在XJad中进行反编译:

//编译前
 for(Integer i:list){
 }
//编译后
for (Iterator iterator = list.iterator(); iterator.hasNext();)
            integer = (Integer)iterator.next();

可以看到增强for循环实质上是由itrator实现的,那么两者有什么差别

//for循环删除集合元素
         for(int i =0;i < list.size(); i++){
             if(list.get(i).equals(2)){
                 list.remove(i);
             }
         }
         System.out.println("普通for:" + list);
         //itrator
         Iterator<Integer> it = list.iterator();
         while(it.hasNext()){
             Integer temp = it.next();
             if(temp.equals(2)){
                 it.remove();
             }
         }
         System.out.println("iterator:" + list.toString());

输出结果:

这里写图片描述

可以看到普通for循环没有完全删除2,iterator删除了所有2,原因是什么呢:

  1. list底层是数组,删除一个元素后下标左移,发生错误

  2. iterator的remove()方法有一步:expectedModCount = modCount

用增强for删除的结果:

`java
“//foreach删除集合元素
for(Integer i:list){
if(i.equals(2)){
list.remove(i);
}
}
System.out.println(“forEach:” + list);


```java
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at com.shui.main.MainText.main(MainText.java:22)

分析:list底层有一个modcount标记,每次进行修改前会加1,再次删除是使用 if (modCount != expectedModCount) 进行判断是否相等,相等才可以操作。不能进行删除,但是可以修改

小节:

  • 增强for循环结构清晰书写方便,但是不适用于集合的删除操作,可以用于做修改操作
  • iterator的remove()可以准确删除集合元素,但是不适合进行修改操作
原文地址:https://www.cnblogs.com/shuiyj/p/13185263.html