java - for循环优化

标签 java coding-style optimization

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

我的 for 循环目前看起来像这样......

for (int i = 0; i < flowers.size(); i++) {
...
}

或者我应该把它改成下面给出的代码

int size = flowers.size();
for (int i = 0; i < size; i++) {
...
}

哪个性能更好(假设我有一大堆花),我猜应​​该是后者。

最佳答案

最好使用 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 version "1.6.0_22" Java(TM) SE Runtime Environment (build 1.6.0_22-b04) Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)

因此,如果您需要从上述两个中进行选择,请选择第二个,但我个人会选择 for-each


每个性能

来自 Effective Java 中的第 46 项约书亚布洛赫:

The for-each loop, introduced in release 1.5, gets rid of the clutter and the opportunity for error by hiding the iterator or index variable completely. The resulting idiom applies equally to collections and arrays:

// The preferred idiom for iterating over collections and arrays
for (Element e : elements) {
    doSomething(e);
}

When you see the colon (:), read it as “in.” Thus, the loop above reads as “for each element e in elements.” Note that there is no performance penalty for using the for-each loop, even for arrays. In fact, it may offer a slight performance advantage over an ordinary for loop in some circumstances, as it computes the limit of the array index only once. While you can do this by hand (Item 45), programmers don’t always do so.


另见

关于java - for循环优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6093537/

相关文章:

java - 屏幕和警棍的分割 Pane

java - 如何在 Swing 中将一个窗口停靠到另一个窗口?

c++ - "single assignment"与 "no early return"

关于阅读小文件的python风格问题

c# - 如何优化欧氏算法?

java - 如何将代码外部化为抽象类

java - 为什么盒装原语不支持所有运算符?

python - Python 单元测试中对象的长定义

regex - 用于合并具有匹配的第一个字段的行的命令行,50 GB 输入

python - Python的基本优化模式有什么用? ( python -O)