循环列表,更好的方法

Gee*_*ddy 9 java loops arraylist

当我在Java中编写和发现新的处理方式时,我总是对通过列表循环输出数据的更好方法感到困惑.

在下面的例子中,我循环遍历列表并使用计数器,因此很多次我必须在输出中包含一个索引计数器.

我偏爱方法1,但我发现这些方法中的任何一个都有点过时了.我已经看到很多循环列表的例子,而且主要使用方法2.

所以我的问题是什么是更好的方法,如果所有这些方法都一样,那么最标准的是什么?

private ArrayList<String> list = new ArrayList<String>();

public Test() {
    list.add("One");        
    list.add("Two");        
    list.add("Three");      
    list.add("Four");       
    list.add("Five");

    method1();
    method2();
    method3();
}

public void method1() {
    System.out.println("Method 1");
    int i = 1;
    for (String value:list) {
        System.out.println((i++) + " = " + value);
    }
}

public void method2() {
    System.out.println("Method 2");
    for (int i = 0; i < list.size(); i++) {
        System.out.println((i+1) + " = " + list.get(i));
    }
}

public void method3() {
    System.out.println("Method 3");
    Iterator<String> it = list.iterator();
    int i = 1;
    while (it.hasNext()) {
        System.out.println((i++) + " = " + it.next());
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_* C. 18

method1()类似于method3()for-each循环在幕后使用List的迭代器.不同之method3()处在于您实际上可以访问此迭代器,因此如果要从列表中删除元素,可以在其上调用remove.

method2()另一方面,取决于底层实现,可能导致"糟糕"的表现.如果您的列表是a LinkedList,则get具有O(n)复杂性时间,因此for循环将具有O(n^2)复杂性.使用迭代器,您将始终在恒定时间内获得下一个元素.

我个人会使用1,它也可以编写更少的代码,如果您的意图是对数据结构执行只读操作,这是for-each循环的主要好处之一.

如果您使用的是Java 8并且不需要打印索引,那么您还可以:

list.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

  • 你是对的.我留下评论,所以每个人都可以像我刚才那样学习 (8认同)
  • @Loki不,lambda中的变量必须是最终的.您可以使用`AtomicInteger`,虽然它有点矫枉过正. (5认同)
  • `int index = 1; list.forEach(e-> System.out.println((index ++)+"="+ e));`你也可以打印索引 (2认同)