【Java】ArrayList 四种遍历方式速度对比

ArrayList 四种遍历方式速度对比

测试代码

package com.yorkey;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;

import java.util.*;

public class ArrayListTest {

    @Test
    public void testLoopEfficiency() {
        // 循环次数:10w次,100w次,1000w次
        int[] loopTimes = {10_0000, 100_0000, 1000_0000};
        // 防止偶然,重复遍历的次数
        int repeats = 20;
        Random r = new Random();
        List<Integer> list = new ArrayList<>();
        for (int loopTime : loopTimes) {
            System.out.printf("当前迭代次数:%s\n", loopTime);
            list.clear();
            // *********** 填充数据 ***********
            for (int i = 0; i < loopTime; i++) {
                list.add(r.nextInt());
            }
            // *********** 测试遍历速度 ***********
            // 下标访问
            doLoop(()-> {
                for (int i = 0; i < list.size(); i++) {
                    int code = list.get(i).hashCode();
                    code--;
                }
            }, "下标访问", repeats);

            // 迭代器
            doLoop(()-> {
                Iterator<Integer> iterator = list.iterator();
                while (iterator.hasNext()) {
                    int code = iterator.next().hashCode();
                    code--;
                }
            }, "迭代器", repeats);

            // 高级for循环
            doLoop(()-> {
                for (Integer integer : list) {
                    int code = integer.hashCode();
                    code--;
                }
            }, "高级for循环", repeats);

            // forEach
            doLoop(()-> {
                list.forEach(e -> {
                    int code = e.hashCode();
                    code--;
                });
            }, "forEach", repeats);
            System.out.println("========================");
        }
    }

    private void doLoop(Executable executable, String name, int repeats) {
        int total = 0;
        for (int i = 1; i <= repeats; i++) {
            long startTime = System.currentTimeMillis();
            try {
                executable.execute();
            } catch (Throwable e) {
                e.printStackTrace();
            }
            long endTime = System.currentTimeMillis();
            total += endTime - startTime;
            // System.out.printf("[第%d次] %s: %dms\n", i, name, endTime - startTime);
        }
        System.out.printf("[%d次平均] %s: %.2fms\n", repeats, name, (double) total / repeats);
    }

}

测试结果

当前迭代次数:100000
[20次平均] 下标访问: 0.60ms
[20次平均] 迭代器: 0.75ms
[20次平均] 高级for循环: 0.85ms
[20次平均] forEach: 0.45ms
========================
当前迭代次数:1000000
[20次平均] 下标访问: 1.55ms
[20次平均] 迭代器: 1.70ms
[20次平均] 高级for循环: 1.60ms
[20次平均] forEach: 1.75ms
========================
当前迭代次数:10000000
[20次平均] 下标访问: 15.70ms
[20次平均] 迭代器: 17.95ms
[20次平均] 高级for循环: 16.40ms
[20次平均] forEach: 18.60ms
========================

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值