3 回答
TA贡献1836条经验 获得超5个赞
最好使用for-each循环 [更具可读性]
for (Flower flower :flowers){
//...
}
我已将指令转储javap用于以下代码:
public void forLoop1() {
List<String> lst = new ArrayList<String>();
for (int i = 0; i < lst.size(); i++) {
System.out.println("hi");
}
}
public void forLoop2() {
List<String> lst = new ArrayList<String>();
int size = lst.size();
for (int i = 0; i < size; i++) {
System.out.println("hi");
}
}
public void forLoop1();
Code:
0: new #2; //class java/util/ArrayList
3: dup
4: invokespecial #3; //Method java/util/ArrayList."<init>":()V
7: astore_1
8: iconst_0
9: istore_2
10: iload_2
11: aload_1
12: invokeinterface #4, 1; //InterfaceMethod java/util/List.size:()I
17: if_icmpge 34
20: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
23: ldc #6; //String hi
25: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
28: iinc 2, 1
31: goto 10
34: return
public void forLoop2();
Code:
0: new #2; //class java/util/ArrayList
3: dup
4: invokespecial #3; //Method java/util/ArrayList."<init>":()V
7: astore_1
8: aload_1
9: invokeinterface #4, 1; //InterfaceMethod java/util/List.size:()I
14: istore_2
15: iconst_0
16: istore_3
17: iload_3
18: iload_2
19: if_icmpge 36
22: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
25: ldc #6; //String hi
27: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
30: iinc 3, 1
33: goto 17
36: return
它没有为我优化。
Java版本“ 1.6.0_22” Java™SE运行时环境(内部版本1.6.0_22-b04)Java HotSpot(TM)客户端VM(内部版本17.1-b03,混合模式,共享)
因此,如果您需要从上述两个中进行选择,请争取第二,但我个人会建议for-each。
每个绩效
摘自Joshua Bloch撰写的有效Java的条款46 :
版本1.5中引入的for-each循环通过完全隐藏迭代器或index变量,摆脱了混乱和出错的机会。结果成语同样适用于集合和数组:
// The preferred idiom for iterating over collections and arrays
for (Element e : elements) {
doSomething(e);
}
当您看到冒号(:)时,将其读为“ in”。因此,上面的循环读为“针对元素中的每个元素e”。请注意,即使对于数组,使用for-each循环也不会降低性能。 。实际上,在某些情况下,它可能只比普通的for循环提供一点性能优势,因为它只计算一次数组索引的限制。尽管您可以手动执行此操作(第45项),但程序员并非总是如此。
TA贡献1798条经验 获得超3个赞
JVM无法优化它,因为它size()
是一种方法,并且JVM无法(也不会尝试)确定size()
在这种情况下总是返回相同的值。提供的size()
值不会改变,第二个值的性能会更高,但是收益是如此,以至于您甚至不必考虑使用它。
添加回答
举报