foreach:为什么元素变量不能在外面声明?

例如,Java中的“foreach”

for (Mouse mouse: mouses) {
    [...]}

我们做不到:

Mouse mouse;for (mouse: mouses) {
    [...]}

我引用geeksforgeeksSince 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不能简单地在循环内重新分配?


临摹微笑
浏览 1950回答 2
2回答

BIG阳

根据Java规范,你编写的for-each(或增强for)循环将扩展为:for(java.util.Iterator&nbsp;i&nbsp;=&nbsp;mouses.iterator();&nbsp;i.hasNext();&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;Mouse&nbsp;mouse&nbsp;=&nbsp;(Mouse)&nbsp;i.next(); &nbsp;&nbsp;&nbsp;[...]}(JLS)因此,为了避免mouse在循环中“重新声明”&nbsp;变量,您需要模仿for循环的扩展版本,并mouse在外部声明:Mouse&nbsp;mouse;for(Iterator<Mouse>&nbsp;i&nbsp;=&nbsp;mouses.iterator();&nbsp;i.hasNext();&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;mouse&nbsp;=&nbsp;(Mouse)&nbsp;i.next(); &nbsp;&nbsp;&nbsp;[...]}从理论上讲,这可以避免重复释放和分配内存(或者您运行的JVM用于引用的任何内容)mouse,但由于编译时和运行时优化,很可能会更改代码像这样几乎没有差别(或者你甚至可能因为在增强的循环上运行常规循环而失去一些速度)。

MMTTMM

至于另一个相关问题,final对性能没有影响。这只是(编译时)检查变量在其范围内没有重新分配。编译class&nbsp;Foo{ &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;foo(int[]&nbsp;arr) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(/*final*/&nbsp;int&nbsp;a&nbsp;:&nbsp;arr) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(a); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}产生完全相同的字节码有或没有强调final(截至javac 1.8.0_211)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java