增强性循环和普通循环(ArrayList)

普通循环:利用index实现

增强型循环:通过迭代器实现

示例代码:

public class ArrayListTest {

    public static void main(String[] args) {
        normalFor(getList());   //普通循环
        iterator(getList());      //增强循环-迭代器
        forEach(getList());     //增强循环-foreach方式
    }

    //普通循环
    private static void normalFor(List<String> list) {
        for (int i = 0 ; i < list.size() ; i++){
            if ("b".equalsIgnoreCase(list.get(i)) || "d".equalsIgnoreCase(list.get(i))){
                list.remove(i);
            }
        }
        System.out.println("normalFor:"+JSONObject.toJSONString(list));
    }

  //增强循环-迭代器
  private static void iterator(List<String> list) {
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            String str = (String) iterator.next();
            if ("b".equalsIgnoreCase(str) || "d".equalsIgnoreCase(str)){
                iterator.remove();
            }
        }
        System.out.println("iterator:"+JSONObject.toJSONString(list));
    }
   //增强循环-foreach方式
    private static void forEach(List<String> list) {
        for (String str : list){
            if ("b".equalsIgnoreCase(str) || "d".equalsIgnoreCase(str)){
                list.remove("b");
            }
        }
        System.out.println("forEach:"+JSONObject.toJSONString(list));
    }

    private static List<String> getList(){
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        return list;
    }
}

输出

normalFor:["a","c","d","e"]
iterator:["a","d","e"]
Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
  at java.util.ArrayList$Itr.next(ArrayList.java:859)
  at com.qxy.collection.ArrayListTest.forEach(ArrayListTest.java:47)
  at com.qxy.collection.ArrayListTest.main(ArrayListTest.java:21)

Process finished with exit code 1

  

从上边可以看出

类型 输出结果
普通循环 正常输出,结果错误
增强循环-迭代器 正常输出,结果正确
增强循环-foreach 报异常

普通循环

普通循环,底层是数组,在remove操作时,被删除元素的后边所有的元素,会往前挪挪一位。咱们还是看图,比较直观

当第一次删除时,此时的 i = 1,b正常删除,c、d、e此时都往前挪了一位,然后执行了 i+1 变成了2,也就是d 的位置,一直往后都没匹配到c,所以导致c为正常删除。

增强循环-迭代器

在分析之前,我们先来看看反编译之后的代代码

public class ArrayListTest {
    ...

    private static void iterator(List<String> list) {
        Iterator iterator = list.iterator();
        while(true) {
            String str;
            do {
                if (!iterator.hasNext()) {
                    System.out.println("iterator:" + JSONObject.toJSONString(list));
                    return;
                }

                str = (String)iterator.next();
            } while(!"b".equalsIgnoreCase(str) && !"c".equalsIgnoreCase(str));

            iterator.remove();
        }
    }

    private static void forEach(List<String> list) {
        Iterator var1 = list.iterator();
        while(true) {
            String str;
            do {
                if (!var1.hasNext()) {
                    System.out.println("forEach:" + JSONObject.toJSONString(list));
                    return;
                }

                str = (String)var1.next();
            } while(!"b".equalsIgnoreCase(str) && !"c".equalsIgnoreCase(str));

            list.remove(str);
        }
    }
  ...
}

  

原文地址:https://www.cnblogs.com/qxynotebook/p/11253257.html

时间: 2024-08-30 00:58:37

增强性循环和普通循环(ArrayList)的相关文章

List遍历三种方法:1.for 2.增强性for 3.迭代器

package chapter09; import java.util.ArrayList;import java.util.Iterator;import java.util.List; /* * List遍历三种方法:1.for 2.增强性for 3.迭代器 */public class TestList { public static void main(String[] args) { // 声明一个集合 List list = new ArrayList(); String aStri

【代码优化】for-each代替普通的for循环或者while循环

对于集合的遍历首选方法是for-each for(Element e :c){ doSomething(e): } 这是1.5版本之后的做法:java1.5之前使用的是Iterator迭代器. 为了弄清楚为啥比普通的for循环或者whlie循环好,请看一下代码 Iterator<Element> i=c.iterator(); while(i.hasNext()){ doSomething(i.next()); } Iterator<Element> i2=c.iterator()

网络编程(三)——通信循环、链接循环、粘包问题

通信循环.链接循环.粘包问题 一.通信循环 服务端和客户端可以进行连续的信息交流 from socket import * ser_socket = socket(AF_INET, SOCK_STREAM) ser_socket.bind(('127.0.0.1', 8886)) ser_socket.listen(5) conn, addr = ser_socket.accept() while True: try: # 抛出异常,若不抛出处理,一旦客户端强行退出,服务端就会报错 data =

JS中的循环结构、循环嵌套以及函数介绍

[循环结构的步骤]    *①声明循环变量    *②判断循环条件    *③执行循环体(while的{}中的所有代码)操作     *④更新循环变量    *     * 然后,循环执行②③④    *     *     * [JS中循环条件支持的数据类型]    * ①boolean:true 真     false   假    * ②string: 非空字符串为真       空字符串为假    * ③null/NaN/undefined:  全为假    * ④object:全为真 

python循环之for循环与模拟购物车小程序

for循环 for 变量 in 范围:     代码块...         contune                 #跳出本次循环接着执行下一次循环     for 变量 in 范围:         代码块...             break              #跳出本层循环,回到上一个for循环 else:                #其实for循环和while循环都有else子句,不过是当循环完全执行了才会执行     代码块...               

while 循环 于 for循环语句

while 循环 while 循环 while 条件: 如果条件是真的,就继续的循环 如果条件是假的,就停止循环 循环的意思就是让程序重复地执行某些语句,whiler循环就是循环结构的一种,当事先不知道循环该执行多少次,就要用到while循环 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为 while 判断条件: 执行语句…… 这块一定要注意缩进 执行语句可以是单个语句或语句块.判断条件可以是任何表达式,任何非零

关于Qt的事件循环以及QEventLoop的简单使用(QEventLoop::quit()能够终止事件循环,事件循环是可以嵌套的)

http://www.cnblogs.com/-wang-cheng/p/4973021.html 1.一般我们的事件循环都是由exec()来开启的,例如下面的例子: 1 QCoreApplicaton::exec() 2 QApplication::exec() 3 QDialog::exec() 4 QThread::exec() 5 QDrag::exec() 6 QMenu::exec() 这些都开启了事件循环,事件循环首先是一个无限“循环”,程序在exec()里面无限循环,能让跟在ex

for循环和while循环的区别及用法

for循环和while循环是可以互相代替的,比如: for (int i = 0; i<10; i++) {...//插入语句 } 用while来写就是int i = 0;while (i<10) {...//插入语句i++;} for循环比较简洁,会比while更常用些,尤其是用array的时候,很方便的. 但是如果想做无限循环,while更方便点,比如说int i = 1;while (i == 1){ ... } 还有一种do..while,和while差不多,但是do...while在

C#中的循环语句:while循环和for循环(二)

上一篇写了while循环,这一篇就来写一写for循环.相比while循环,for循环要复杂一点,但比while循环更直观一些. for循环的格式为: for(表达式1;循环条件;表达式2) { 循环体 } 表达式1一般用来定义变量:循环条件如果为"true",那么循环继续,反之循环结束,如果是空,就变成死循环了:表达式2一般用于变量的自增或者自减.举个例子,如果在控制台中输出100个你好,用for循环来实现的话,就像这样: for(int i=0; i<100; i++) { C

C#中的循环语句:while循环和for循环(一)

假如我们要做很多事情的时候,比如说我们要输出上百个数字,一个一个输出的话不仅麻烦而且费时多.效率低.这时C#就为我们提供了更为简单的输出方法,即循环.循环类型有多种,这里我比较两种循环方式:while循环&for循环. 首先来说说while循环: While循环的格式非常简单: While(循环条件) { 循环体 } 意思是,当逻辑值是"true"时,循环体就一直不停地循环,直到逻辑值变成"false",才会停.如果逻辑值一直是true,循环就不会停,也就是