【Java】List集合遍历分析

在 Java 中,我们应当坚持使用迭代器iterator或者forEach循环遍历 List ,因为它俩总能根据不同的类型提供最快的遍历速度。(实际上是先有了 iterator ,然后 Java 官方为了优化代码复杂度,又推出了基于 iterator 的 forEach 循环,它俩是同一种方式的不同写法)

本文将测试ArrayList集合LinkedList集合在三种循环下的遍历速度,样本容量大小为 10000 :

  1. for循环
  2. forEach循环
  3. iterator迭代器

测试代码范例

public class Dog {
    
    
    public static void main(String[] args) {
    
    
        List<Object> list = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
    
    
            list.add(i);
        }
        // 1
        long start1 = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
    
    
            System.out.print(list.get(i));
        }
        long end1 = System.currentTimeMillis();
        // 2
        long start2 = System.currentTimeMillis();
        for (Object obj : list) {
    
    
            System.out.print(obj);
        }
        long end2 = System.currentTimeMillis();
        // 3
        long start3 = System.currentTimeMillis();
        Iterator<Object> iterator = list.iterator();
        while (iterator.hasNext()){
    
    
            System.out.print(iterator.next());
        }
        long end3 = System.currentTimeMillis();
        // 时间
        System.out.println();
        System.out.println("for耗时:" + (end1 - start1)+" 毫秒");
        System.out.println("forEach耗时:" + (end2 - start2)+" 毫秒");
        System.out.println("iterator耗时:" + (end3 - start3)+" 毫秒");
    }
}

一、结果:ArrayList

for耗时:13 毫秒
forEach耗时:10 毫秒
iterator耗时:10 毫秒

二、结果:LinkedList

for耗时:67 毫秒
forEach耗时:11 毫秒
iterator耗时:11 毫秒

三、结论

  可以看到,使用forEach循环和使用iterator迭代器的效果是一样的,实际上编译器会把 forEach 循环编译成 for + iterator 循环;同时单纯的for循环的性能较差,所以我们应当坚持使用iterator迭代器或者forEach循环遍历 List。

  • 编译前
List<String> list = List.of("Apple", "Orange", "Pear");
for (String s : list) {
    
    
    System.out.println(s);
}
  • 编译后
List<String> list = List.of("Apple", "Orange", "Pear");
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
    
    
     String s = it.next();
     System.out.println(s);
}

猜你喜欢

转载自blog.csdn.net/qq_35760825/article/details/125359162