阿晨1998
在第一个示例中,msg在显示的最外层作用域中处于作用域内,而msg在第二个示例中仅在循环体中处于作用域内。在我继续之前,我会提醒读者,过早的优化,尤其是这里看到的微优化,通常并不合适或有用,首先应该争取清晰、可读和可维护的代码。我现在将继续为好奇的读者。通过使用javac 1.8.0_171编译代码并使用 反汇编javap -c,我得到以下字节码:第一种方法: Code: 0: aconst_null 1: astore_1 2: iconst_0 3: istore_2 4: iload_2 5: bipush 10 7: if_icmpge 19 10: ldc #2 // String f 12: astore_1 13: iinc 2, 1 16: goto 4 19: return第二种方法: Code: 0: iconst_0 1: istore_1 2: iload_1 3: bipush 10 5: if_icmpge 17 8: ldc #2 // String f 10: astore_2 11: iinc 1, 1 14: goto 2 17: return如您所见,两个编译结果在本质上非常相似。两者都具有循环结构,循环体由负载常量 (ldc) 和astore_<n>一个局部变量槽组成。变量对槽的分配是不同的(第一个分配i给槽 2 和msg1,第二个则相反)但这应该不会产生显着影响。第一个确实包括两个额外的字节码,null以便msg在第一次迭代之前存储。然而,这种影响是如此微小,以至于尝试优化它是没有意义的。我目前没有工具集来查看 JIT 优化产生的机器代码,但我强烈怀疑整个循环会被任何有能力的 JIT 编译器优化掉。