Java List 5 种迭代方式性能比较

#代码实例

package tech.zhuyuan.demo.designpattern.iterator.concurrent;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 5种迭代方式
 */
public class FiveKindsOfIterationPerfTest {

    /**
     * 生成指定数量的从1-n的列表
     *
     * @param n
     * @return
     */
    protected static List<Integer> generateNumList(int n) {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            list.add(1);
        }
        return list;
    }

    /**
     * for循环原始方式
     *
     * @param list
     */
    private static long showFor(List<Integer> list) {
        long start = System.nanoTime();
        for (int i = 0; i < list.size(); i++) {
            Integer clone = list.get(i);
        }
        long end = System.nanoTime();
        return end - start;
    }

    /**
     * for循环原始方式改进
     *
     * @param list
     */
    private static long showAdvancedFor(List<Integer> list) {
        long start = System.nanoTime();
        for (int i = 0, size = list.size(); i < size; i++) {
            Integer clone = list.get(i);
        }
        long end = System.nanoTime();
        return end - start;
    }

    /**
     * Iterator(迭代器) JDK 1.2增加
     *
     * @param list
     */
    private static long showIterator(List<Integer> list) {
        long start = System.nanoTime();
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            Integer clone = it.next();
        }
        long end = System.nanoTime();
        return end - start;
    }

    /**
     * 增强版for循环 JDK 1.5增加,需要实现java.util.Iterable接口
     *
     * @param list
     */
    private static long showEnhancedFor(List<Integer> list) {
        long start = System.nanoTime();
        for (Integer num : list) {
            Integer clone = num;
        }
        long end = System.nanoTime();
        return end - start;
    }

    /**
     * foreach JDK 1.8 添加
     *
     * @param list
     */
    private static long showForeach(List<Integer> list) {
        long start = System.nanoTime();
        list.forEach(o -> {

        });
        long end = System.nanoTime();
        return end - start;
    }

    public static void main(String[] args) {
        int n = 10;
        List<Integer> list = generateNumList(n);
        System.out.println(n + ": \t" + showFor(list) + "\t"
                + showAdvancedFor(list) + "\t"
                + showIterator(list) + "\t"
                + showEnhancedFor(list)
                + "\t" + showForeach(list));
    }
}

#比较结果

列表采用ArrayList,如果是LinkedList效果将会很不一样。ArrayList和LinkedList分别对应数据结构的线性表和单链表,在CRUD各种操作上性能本身就不一样。


测试结果仅供参考,由于计算机本身性能问题会导致结果不同,而且多次执行结果也是不同的,偶尔还会出现某一个值特别高的情况,这些暂且不谈。


执行时间为纳秒。
| 类型\size | 10 | 100 | 1000 | 10,000| 100,000 | 1,000,000 | 10,000,000
| ------------- |:-------------😐 -----😐 -----😐 -----😐 -----😐 -----😐
| showFor | 5,287 | 19,905 | 107,924 | 685,482 | 3,819,917 | 6,844,563 | 13,006,441
| showAdvancedFor | 933 | 12,441 | 72,778 | 336,521 | 2,350,670 | 5,247,799 | 9,558,190
| showIterator | 19,283 | 35,145 | 167,950 | 862,763 | 3,925,352 | 7,340,946 | 14,012,272
| showEnhancedFor | 1,886 | 15,551 | 130,005 | 544,592 | 3,675,294 | 7,628,327 | 14,236,827
| showForeach | 37,434,690 | 39,432,978 | 40,047,237 | 37,935,117 | 43,071,883 | 44,288,272 | 46,217,203
#总结

  1. 改进版for循环性能最好
  2. java 8 forEach性能最差,其次最差的是Iterator(迭代器模式)
  3. 数据量很小的话普通的for循环没有增强版for循环好,但是当数据量很大差别不大。

个人建议:一般数据量可以直接选择增强版for循环,数据量很大的时候使用改进版for循环。使用增强版for循环理由是书写简单,程序改造时降低耦合度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值