有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

获取列表元素的java迭代器和whileloop vs forloop vs foreach性能

我是编程新手 我学习了三种获取列表元素的方法 我知道他们每个人在特定情况下都很好 但我想知道哪一个在整体(性能)上更好

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();

        for (int i = 0; i <= 15; i++) {
            arrayList.add(i + 666);
        }


        Iterator<Integer> iterator = arrayList.iterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next() + "Iterator");
        }

        System.out.println("==============");
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i) + " for ");
        }

        System.out.println("==============");
        for (int i : arrayList) {
            System.out.println(i + " for each");
        }
    }
}

多谢各位


共 (4) 个答案

  1. # 1 楼答案

    请不要比较它们。你不能一直使用所有的样式

    首先,样式1(while (...))和样式3(for-each)是相同的。样式3(for-each)在内部使用样式1(iteratorwhile

    如果要在迭代时对列表执行操作,请使用iterator样式。它支持这一点

    您不能修改样式2中的列表(简单^{)。如果你只想阅读列表,而不想做除此之外的任何事情,那么选择style 2

    毕竟,它是使用索引从底层数组中获取元素。在传统的for循环中,您要传递index,如果是迭代器,它会在内部不断增加自身(index

  2. # 2 楼答案

    没有任何指定的循环来访问数组的元素。在不同的条件下,不同的循环是有用的。大多数情况下,while循环用于访问列表中的元素。但这又取决于何时使用哪个循环。。。你已经对循环的不同有了更好的了解

  3. # 3 楼答案

    for (int i: arrayList){
        System.out.println(i + " for each");
    }
    

    Iterator<Integer> iterator = arrayList.iterator();
    
    while (iterator.hasNext()){
        System.out.println(iterator.next() + "Iterator");
    }
    

    这只是语法上的糖

    这个

    for (int i=0; i<arrayList.size(); i++){
        System.out.println(arrayList.get(i) + " for ");
    }
    

    可能更好一点,但仅适用于ArrayList,但实际上不应该产生可测量的差异,因为迭代器不会做任何不同于此的事情。然而,对于其他没有O(1)get(int index)的列表实现来说,这要糟糕得多(LinkedList)

  4. # 4 楼答案

    不要考虑表演。在mirco管理层,你甚至不会注意到这一点。此外,在Collection上迭代需要Iterator。增强的for循环是一种语法糖,但它与Iterator相同。唯一的区别是,在循环过程中,显式地需要一个Iterator来修改Collection。见How to avoid "ConcurrentModificationException" while removing elements from `ArrayList` while iterating it?

    最后,基于范围的循环是一种限制迭代次数的方法,而其他循环则迭代整个集合(除了在循环块中添加一些条件)