zoukankan      html  css  js  c++  java
  • Java中LinkedList的fori和foreach效率比较

    在《Java中ArrayList的fori和foreach效率比较》中对ArrayList的两种循环方式进行了比较,本次对LinkedList的两种遍历方式进行效率的比较。

    1. list的元素为自定义的对象

    • 自定义的Student类
    public class Student {
    
        private String name;
    
        private Integer age;
    
        public Student(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public Integer getAge() {
            return age;
        }
    }
    
    • 【代码实例1】
        public static void main(String[] args) {
            List<Student> list = new LinkedList<Student>();
            int maxNum = 100000;
            for (int i = 0; i < maxNum; i++) {
                list.add(new Student("student" + i, i));
            }
    
            //开始测试不同方式的for性能
            int listSize = list.size();
            String searchName = "student666";
            boolean searchFlag = false;
    
            //基本形式的for循环
            long startTime1 = System.currentTimeMillis();
            for (int i = 0; i < listSize; i++) {
                Student val = list.get(i);
                if (searchName.equals(val.getName())) {
                    searchFlag = true;
                }
            }
            long endTime1 = System.currentTimeMillis();
    
            //foreach形式
            long startTime2 = System.currentTimeMillis();
            for (Student stu : list) {
                if (searchName.equals(stu.getName())) {
                    searchFlag = true;
                }
            }
            long endTime2 = System.currentTimeMillis();
    
            //输出运行时间
            System.out.println("fori: " + (endTime1 - startTime1));
            System.out.println("forearch: " + (endTime2 - startTime2));
    
        }
    
    • 【运行结果】
    fori: 28628
    forearch: 10
    

    2. list元素为Integer

    • 【代码实例2】
        public static void main(String[] args) {
            List<Integer> list = new LinkedList<Integer>();
            int maxNum = 10000;
            for (int i = 0; i < maxNum; i++) {
                list.add(i);
            }
    
            //开始测试不同方式的for性能
            int listSize = list.size();
            Integer searchVal = 66666;
            boolean searchFlag = false;
    
            //基本形式的for循环
            long startTime1 = System.currentTimeMillis();
            for (int i = 0; i < listSize; i++) {
                Integer val = list.get(i);
                if (searchVal.equals(val)) {
                    searchFlag = true;
                }
            }
            long endTime1 = System.currentTimeMillis();
    
            //foreach形式
            long startTime2 = System.currentTimeMillis();
            for (Integer val : list) {
                if (searchVal.equals(val)) {
                    searchFlag = true;
                }
            }
            long endTime2 = System.currentTimeMillis();
    
            //输出运行时间
            System.out.println("fori: " + (endTime1 - startTime1));
            System.out.println("forearch: " + (endTime2 - startTime2));
    
        }
    
    • 【运行结果】
    fori: 55
    forearch: 2
    

    3. 结果分析及结论

    从【代码实例1】和【代码实例2】的多次运行结果来看,fori的性能是远落后于foreach的性能。可以看出,当list为LinkedList的时候,建议使用foreach的方式来遍历,效率较高。以上结果是在上述代码的条件下得出的,仅供参考。

  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/acode/p/6497024.html
Copyright © 2011-2022 走看看