Java中循环的局部变量初始化最有效的方法是什么?

Vit*_*nko 0 java variables performance loops

可能重复:
在循环内部或外部声明变量

请考虑这两个Java代码示例:

// 1st sample
for (Item item : items) {
    Foo foo = item.getFoo();
    int bar = item.getBar();
    // do smth with foo and bar
}

// 2nd sample
Foo foo;
int bar;
for (Item item : items) {
    foo = item.getFoo();
    bar = item.getBar();
    // do smth with foo and bar
}
Run Code Online (Sandbox Code Playgroud)

样品之间的性能/内存消耗是否有任何差异?如果是,那么它是否依赖于句柄的类型(对象与原语)?

Pet*_*rey 8

它在生成的字节代码方面有所不同,但在性能方面没有差异.

更重要的是使代码尽可能简单,自包含和可维护.出于这个原因,我更喜欢第一个例子.

顺便说一句:更简单的代码经常被更好地优化,因为它更容易让JIT尽可能地进行优化.令人困惑的代码也会混淆JIT,它会阻止使用优化.

如果您使用ASMifierClassVisitor以可读的形式转储原始字节代码(并且可以将其转换回原始字节代码)您将看到javap一些不那么重要的细节.

如果我比较(在左下方)951字节长.

List<Item> items = new ArrayList<Item>();

Foo foo;
int bar;
for (Item item : items) {
    foo = item.getFoo();
    bar= item.getBar();
    // do something with foo and bar
}
Run Code Online (Sandbox Code Playgroud)

(在右下方)和935字节长.

List<Item> items = new ArrayList<Item>();

for (Item item : items) {
    Foo foo = item.getFoo();
    int bar = item.getBar();
    // do something with foo and bar
}
Run Code Online (Sandbox Code Playgroud)

您至少可以看到调试行号必须不同,但是一些代码也是不同的,以及以不同顺序定义的局部变量并给出不同的分配号.

在此输入图像描述

您可以right click=> View Image更好地查看图像.

  • 根据我发布的链接,相同的字节码... (3认同)
  • `javap`在重要细节中显示了大致相同的字节代码.但至少线数不能相同. (2认同)