为了账号安全,请及时绑定邮箱和手机立即绑定

用于循环优化

用于循环优化

慕标5832272 2019-09-24 15:42:07
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++) {...}哪个表现更好(假设我有很多花),我猜应该是后者。
查看完整描述

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项),但程序员并非总是如此。


查看完整回答
反对 回复 2019-09-24
?
呼如林

TA贡献1798条经验 获得超3个赞

JVM无法优化它,因为它size()是一种方法,并且JVM无法(也不会尝试)确定size()在这种情况下总是返回相同的值。提供的size()值不会改变,第二个值的性能会更高,但是收益是如此,以至于您甚至不必考虑使用它。


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 381 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信