我必须使用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
具有相同的内容,但只是循环条件的差异。谁能告诉我上面的迭代中究竟发生了什么?
答案 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(保持简单愚蠢)并仅在遇到真正的性能问题时进行优化。