zoukankan      html  css  js  c++  java
  • 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()可以准确删除集合元素,但是不适合进行修改操作
  • 相关阅读:
    SAP C4C OBN(Object Based Navigation)不能工作的原因分析
    使用SAP C4C自定义BO association创建动态下拉列表
    如何使用SAP HANA Studio的PlanViz分析CDS view性能问题
    如何使用jMeter测试SAP OData服务并发访问时的性能
    OData服务在SAP CRM,Cloud for Customer和S/4HANA上的实现比较
    SAP UI5和Vue的数据双向绑定实现原理比较
    在SAP WebClient UI里显示倒数计时的UI
    【年度重磅】2020华为云社区年度技术精选合集,700页+免费下载!
    面试必问:如何实现Redis分布式锁
    聊聊架构模式的变迁:从分层架构到微服务架构
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185263.html
Copyright © 2011-2022 走看看