美文网首页Java8
【Java基础】- for 循环,foreach()

【Java基础】- for 循环,foreach()

作者: lconcise | 来源:发表于2019-09-28 10:29 被阅读0次

list 遍历的4中方式

1. 集合通用遍历方式,迭代器

        // 1. 集合通用遍历方式,迭代器
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

2. 集合通用的变量方式,迭代器

        // 2. 集合通用的变量方式,迭代器
        for (Iterator<String> it2 = list.iterator(); it2.hasNext(); ) {
            System.out.println(it2.next());
        }

3. 增强for循环遍历

        // 3. 增强for循环遍历
        for (String str : list) {
            System.out.println(str);
        }

4. 普通for循环

        // 4. 普通for循环
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

5. 加强版for循环

        // 5. 加强版for 循环
        for (int i = 0, len = list.size(); i < len; i++) {
            System.out.println(list.get(i));
        }

遍历删除元素

1. 增强for循环遍历并删除 错误

        // 增强 for 循环遍历并删除 // 错误
        // 报异常  java.util.ConcurrentModificationException
        for (String str : list) {
            if (str.equals("python")) {
                list.remove(str);
            }
        }
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.example.eureka.MainDemo3.main(MainDemo3.java:49)

增强for 循环内部是依赖Iterator 迭代器实现的遍历,迭代器依赖于集合,集合发生改变,迭代器没有及时改变,故发生异常。

2. 迭代器遍历,迭代器删除

        // 2. 迭代器遍历,迭代器删除
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if ("python".equals(iterator.next())) {
                iterator.remove();
            }
        }

3.使用高级for循环遍历删除/增加元素时,如果在某次循环的过程中进行了删除或者是增加元素的操作,使用break或者return语句结束了循环操作,不报异常

        // 3.使用高级for循环遍历删除/增加元素时,如果在某次循环的过程中进行了删除或者是增加元素的操作,使用break或者return语句结束了循环操作,不报异常
        for (String str : list) {
            if (str.equals("python")) {
                list.remove(str);
                break;
            }
            System.out.println(str);
        }

4. 普通for循环删除,记得减角标

        // 4. 普通for循环删除
        // 忘记减角标 会出现问题 --i
        for (int i = 0; i < list.size(); i++) {
            String str = list.get(i);
            if("python".equals(str)){
                list.remove(i);
                --i;  //  注意一定 角标减一
                continue;
            }
            System.out.println(str);
        }

效率对比

public class Student {

    private String name;

    public Student(String name) {
        this.name = name;
    }
}
        // 添加100万条数据
        List<Student> integerList = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            integerList.add(new Student(String.valueOf(i)));
        }

        // 普通for循环
        long start = System.currentTimeMillis();
        Student student;
        for (int i = 0, len = integerList.size(); i < len; i++) {
            student = integerList.get(i);
        }
        System.out.println();
        System.out.println("普通for循环 time: " + (System.currentTimeMillis() - start)+"ms");

        // 迭代器
        long start2 = System.currentTimeMillis();
        for (Iterator<Student> iterator = integerList.iterator(); iterator.hasNext(); ) {
            student = iterator.next();
        }
        System.out.println();
        System.out.println("迭代器 time: " + (System.currentTimeMillis() - start2)+"ms");

        // 增强for循环
        long start3 = System.currentTimeMillis();
        for (Student i : integerList) {
            student = i;
        }
        System.out.println();
        System.out.println("增强for循环 time: " + (System.currentTimeMillis() - start3)+"ms");

测试结果:

普通for循环 time: 7ms

迭代器 time: 9ms

增强for循环 time: 8ms

相关文章

网友评论

    本文标题:【Java基础】- for 循环,foreach()

    本文链接:https://www.haomeiwen.com/subject/ibrqyctx.html