JDK8版本的ArrayList遍历效率对比

本文通过实验对比了在JDK8环境下,不同遍历方式在ArrayList上的性能表现,包括for循环、增强for循环、迭代器和forEach方法。结果显示,forEach结合Lambda表达式在大规模数据集上展现出更高的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目基本完工(PS:最起码指派给我的部分,我和前端对接联调完了,指派的bug也修复了)
我想着优化一下我的代码,提高一点代码运行效率,最后就找到了这个ArrayList哪种遍历最快
好家伙说好的for循环呢?吹了半天的for循环在,JDK8面前就这?
我模仿着也写了一遍这个测试代码,for循环在真相面前被安排的服服帖帖,在这里插入图片描述
在这里插入图片描述
jdk8应该是主流的版本了吧,forEach雄起!!!!!!

public class ArrayListMain {

    public static void main(String[] args) {
        List<Integer>integers = Arrays.asList(10,100,1000,10000,30000,100000,1000000);
        for(Integer size:integers){
            testRand(size);
        }

    }
    private static void testRand(int size) {
            System.out.println("-----------次数:" + size + "------------");
            List<String> list = createTestList(size);
            // 随机访问通过索引值去遍历。
            long time1 = System.nanoTime();
            testFor(list);
            long time2 = System.nanoTime();
            // 增强for循环
            testForEnhance(list);
            long time3 = System.nanoTime();
            // 迭代器遍历
            testIterator(list);
            long time4 = System.nanoTime();
            // forEach + lambda
            testForEach(list);
            long time5 = System.nanoTime();

            System.out.println("随机访问\t\t" + (time2 - time1) / 1000 + " ms");
            System.out.println("增强for遍历\t\t" + (time3 - time2) / 1000 + " ms");
            System.out.println("迭代器遍历\t\t" + (time4 - time3) / 1000 + " ms");
            System.out.println("forEach遍历\t\t" + (time5 - time4) / 1000 + " ms");
            System.out.println();
        }

    /**
     * 测试 for循环测试效率
     *
     * @param list 列表
     */
    public static void testFor(List<String> list){

        for(int i=0,length=list.size();i<length;i++){
            //hashCode 返回调用这个方法的元素的哈希码
            list.get(i).hashCode();
        }
    }

    /**
     * 测试增强for循环的效率
     *
     * @param list 列表
     */
    public static void testForEnhance(List<String>list){

        for(String sa:list){

            sa.hashCode();
        }
    }
    /**
     * 测试foreach循环效率
     *
     * @param list 列表
     */
    public static void testForEach(List<String>list){
        list.forEach(sa->{
            sa.hashCode();
        });
    }

    /**
     * 测试迭代器循环效率
     *
     * @param list 列表
     */
    public static void testIterator(List<String>list){
        Iterator<String> iterator = list.iterator();
        //hasNext查看迭代器当前是否有值,有的话返回一个true
        while(iterator.hasNext()){
            //next方法取出下一个值
            iterator.next().hashCode();
        }
    }
    public static List<String> createTestList(int size) {
        List<String> list = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
                list.add(UUID.randomUUID().toString());
            }
        return list;
    }
}

代码和人家的没啥区别我自己加了一些注释方便看。(PS:注释是个好东西,大家可以直接直接下载一个插件然后设置自个喜欢的快捷键,写起来非常迅速的,这儿的人不喜欢写注释,我接受看他们的项目就和看天书一样,真让人头大)
人家原文里头讲的挺好的,对于for和forEach的初始加载,大家可以康康,知识就是分享,项目上面我个人觉得不管数据量的大小,还是用forEach比较好把,毕竟项目到了实际中运用的时候,他不是用一会,那个数据量是在不停的叠加的,不停的叠加,
最后那个createTestList是创建list数据
UUID可以理解为一个唯一标识,他的作用就是给你生成一些不重复的数据。
方法里面的迭代器,他的next是通过get方法获取到的在底层实现中可以看到,推荐大家到底层看看,这个迭代器他是一个一个往下走的,也只能一个一个往下走,单向的,用起来要注意,源码并不复杂这个,用之前多了解一下更好。

public class IteratorMain {

    public static void main(String[] args) {
        List<String> lst = new ArrayList<String>();
        lst.add("aaa");
        lst.add("bbb");
        lst.add("ccc");
        lst.add("ddd");
        lst.add("eee");
        lst.add("fff");

        List<String> lst1 = new ArrayList<String>();
        lst1.add("bbb");
        lst1.add("eee");
        lst1.add("333");
        lst1.add("bbb");
        lst1.add("555");
        lst1.add("666");
        int i=0;

        for(String a:lst1){
            //迭代器
            Iterator<String> iterator = lst.iterator();
            i++;

            while(iterator.hasNext()){
                String b = iterator.next();
                if(b == a){

                    lst.add("ggg");
                    break;
                }
                System.out.println(b+"   "+i);
            }
        }
    }
}

for循环原理我也没看,平时也尽量别用这个for辣鸡的很在JDK8底下就属它拉胯了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值