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

    1. list的元素为Integer

    • 【代码实例1】
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<Integer>();
            int maxNum = 1000000;
            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 (val.equals(searchVal)) {
                    searchFlag = true;
                }
            }
            long endTime1 = System.currentTimeMillis();
    
            //foreach形式
            long startTime2 = System.currentTimeMillis();
            for (Integer val : list) {
                if (val.equals(searchVal)) {
                    searchFlag = true;
                }
            }
            long endTime2 = System.currentTimeMillis();
    
            //输出运行时间
            System.out.println("fori: " + (endTime1 - startTime1));
            System.out.println("forearch: " + (endTime2 - startTime2));
    
        }
    
    • 【运行结果】
    fori: 5
    forearch: 8
    

    2. 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;
        }
    }
    
    • 【代码实例2】
        public static void main(String[] args) {
            List<Student> list = new ArrayList<Student>();
            int maxNum = 1000000;
            for (int i = 0; i < maxNum; i++) {
                list.add(new Student("student" + i, i));
            }
    
            //开始测试不同方式的for性能
            int listSize = list.size();
            String searchName = "student6666";
            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: 17
    forearch: 18
    

    3. 分析

    【代码实例1】经过多次运行,可以看出fori确实始终比foreach快,而且在本次的测试中,快的时间还不少。【代码实例2】中list的元素换成了自定义的对象,经过多次运行,时间都差不多,甚至有时两者的运行时间相同。如果非得要对fori和foreach进行循环效率的比较的话,还是建议使用fori的方式。本结果只是针对ArrayList在上述两个测试程序中测试出的结果,仅供参考。

  • 相关阅读:
    UVa 10118 记忆化搜索 Free Candies
    CodeForces 568B DP Symmetric and Transitive
    UVa 11695 树的直径 Flight Planning
    UVa 10934 DP Dropping water balloons
    CodeForces 543D 树形DP Road Improvement
    CodeForces 570E DP Pig and Palindromes
    HDU 5396 区间DP 数学 Expression
    HDU 5402 模拟 构造 Travelling Salesman Problem
    HDU 5399 数学 Too Simple
    CodeForces 567F DP Mausoleum
  • 原文地址:https://www.cnblogs.com/acode/p/6496766.html
Copyright © 2011-2022 走看看