例如,Java中的“foreach”for (Mouse mouse: mouses) {
[...]}我们做不到:Mouse mouse;for (mouse: mouses) {
[...]}我引用geeksforgeeks:Since the i variable goes out of scope with each iteration of the loop, it is actually re-declaration each iteration这样变量只会被声明一次。我不知道这是否可以进行很少的优化,但这就是我在“正常”周期中用各种语言做的事情。此外,通过这种方式,最后一个元素也可以在循环之外使用。例如,这是默认值Python。作为另一个相关问题,有一些优势可做for (final Mouse mouse: mouses) {
[...]}在速度方面,还是mouse不能简单地在循环内重新分配?
2 回答
BIG阳
TA贡献1859条经验 获得超6个赞
根据Java规范,你编写的for-each(或增强for)循环将扩展为:
for(java.util.Iterator i = mouses.iterator(); i.hasNext(); ) { Mouse mouse = (Mouse) i.next(); [...]}
(JLS)
因此,为了避免mouse
在循环中“重新声明” 变量,您需要模仿for循环的扩展版本,并mouse
在外部声明:
Mouse mouse;for(Iterator<Mouse> i = mouses.iterator(); i.hasNext(); ) { mouse = (Mouse) i.next(); [...]}
从理论上讲,这可以避免重复释放和分配内存(或者您运行的JVM用于引用的任何内容)mouse
,但由于编译时和运行时优化,很可能会更改代码像这样几乎没有差别(或者你甚至可能因为在增强的循环上运行常规循环而失去一些速度)。
MMTTMM
TA贡献1869条经验 获得超4个赞
至于另一个相关问题,final
对性能没有影响。这只是(编译时)检查变量在其范围内没有重新分配。编译
class Foo{ void foo(int[] arr) { for (/*final*/ int a : arr) { System.out.println(a); } }}
产生完全相同的字节码有或没有强调final
(截至javac 1.8.0_211
)
添加回答
举报
0/150
提交
取消