【发布时间】:2018-04-07 20:31:12
【问题描述】:
前 2 个例子:
1)
MyClass myClass;
for (int i=0; i<arrayList.size(); i++) {
myClass = arrayList.get(i);
...
}
2)
for (int i=0; i<arrayList.size(); i++) {
MyClass myClass = arrayList.get(i);
...
}
在第一个示例中,引用变量 myClass 仅创建一次。但是在第二个示例中,它是只创建一次,还是每次迭代创建一次?我的想法可能是编译器对此进行了优化,我不知道。
我试图通过编写一个示例来回答这个问题,但无法弄清楚。如何通过代码证明?
注意:我意识到示例 2 的风格更好,因为 myClass 在 for 循环之外不为人所知,并且它的范围保持在最低限度。我也在这里搜索过,但还没有找到这个确切问题的明确答案(通常是“哪个是首选?”的问题。)我还假设如果每次迭代都创建了 myClass 引用,那么它的性能并不高问题。
编辑:同样,我不是在问哪种编码风格更好。另外,我想知道它是否可以通过代码推断/证明。我尝试生成并比较字节码,但我对字节码不熟悉,生成的内容不完全匹配。
【问题讨论】:
-
我猜没关系,这是一个微优化,并不真正需要
-
我建议你检查生成的字节码,我想你会发现它们是相同的(IIRC,我没有仔细检查)。
-
当你声明一个变量时,你不会“创建”任何东西。变量只是一个方便的名称,可帮助您记住将某些结果放在何处,并允许您控制可以在何处使用该结果,并将某些类型信息与该结果相关联。
-
@AxelH 但为什么不在循环中声明呢?你不能在循环之外使用它(因为明确的分配);并且您应该始终在尽可能严格的范围内声明变量。
-
@MarkRotteveel 我试过这个,昨晚第一次查看字节码。它们看起来并不相同,差异很小,但我并没有真正理解这些差异,所以我想我会在这里问。