迭代for循环的哪种方式更好?

时间:2016-09-02 04:52:49

标签: java

我必须使用for-loop进行迭代,但我想知道哪种方式更好。

1

import java.util.ArrayList;

public class FindTime {
    public static void main(String[] args) {
        ArrayList tmpList = new ArrayList();
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");

        long startTime = System.nanoTime();
        for (int i = 0,size=tmpList.size(); i < size; i++) {
            System.out.println(tmpList.get(i).toString());
        }
        long endTime = System.nanoTime();

        System.out.println("Time Duration ::->" + (endTime - startTime));
    }
}

2

import java.util.ArrayList;

public class FindTime {
    public static void main(String[] args) {
        ArrayList tmpList = new ArrayList();
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");
        tmpList.add("me");  tmpList.add("you ");
        tmpList.add("I");   tmpList.add("Us");

        long startTime = System.nanoTime();
        for (int i = 0;i < tmpList.size(); i++) {
            System.out.println(tmpList.get(i).toString());
        }
        long endTime = System.nanoTime();

        System.out.println("Time Duration ::->" + (endTime - startTime));
    }
}

在上文中,两个for-loops具有相同的内容,但只是循环条件的差异。谁能告诉我上面的迭代中究竟发生了什么?

2 个答案:

答案 0 :(得分:12)

你错了。你专注于几乎无所谓的方面;这样做,你在两个例子中写了代码!

首先,您不要使用raw types

你改为:

List<String> theWords = new ArrayList<>();

(请注意:使用List作为列表对象的实际类型也是更好的做法。不需要将其后面的实现公开给该列表的用户)

Java有很好的“填充”列表的方式,比如

List<String> theWords = Arrays.asList("me", "didn't", "know", "that", "but", "could", "have");

然后;你使用for-each迭代各种集合/数组:

for (String aWord : theWords) 

并且你不再担心所有这些低级别的for循环,包括整数和增量。

换句话说:Java不是C.我们在许多地方都有更好的抽象;你最好关注那些;因为他们照顾这些微妙之处。含义:专注于编写“更高级别”的代码 - 因为它创建了可读代码。请放心:如果您遵循典型的“最佳实践”(如上所述使用'for each'进行迭代循环) - 您无需担心性能问题。因为JVM和JIT最擅长优化...如果你使用它们提供给你的抽象!

努力做到聪明;表达“低级别”的东西甚至可能产生负面影响;因为它可能会阻止JIT进行其荣耀优化工作(可能不是在这种情况下)。

答案 1 :(得分:4)

  • 1更快因为tmpList.size()只被调用一次。

  • 2更清晰更容易阅读,因为它更简单。

<强>最干净

以下内容最简洁,因为它易于阅读,并且在每个IDE中都具有完整的语法高亮支持:

for ( String s : tmpList ) {
    System.out.println(s);
}

<强>最快

以下是性能最快的,因为它使用本机数组并避免了无关的对象创建和getter方法调用:

String[] tmpList = String[24];
tmpList[0] = "me";
tmpList[1] = "you";
...

for ( int i = 0; i < tmpList.length; ++i ) {
    System.out.println(tmpList[i]);
}

非常快

实际上,如果你有一个在编译时已知的列表,最快的性能解决方案是展开你的循环。

System.out.println("me");
System.out.println("you");
...

一般情况下KISS(保持简单愚蠢)并仅在遇到真正的性能问题时进行优化。