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

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

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

临摹微笑 2019-04-19 14:15:11
例如,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,但由于编译时和运行时优化,很可能会更改代码像这样几乎没有差别(或者你甚至可能因为在增强的循环上运行常规循环而失去一些速度)。


查看完整回答
反对 回复 2019-05-15
?
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


查看完整回答
反对 回复 2019-05-15
  • 2 回答
  • 0 关注
  • 1949 浏览

添加回答

举报

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