变量声明或定义在循环内外
这里对于变量的作用域就不多说了。1. 对于会被在循环内修改的变量
1.1 其声明在循环体内或是循环体外是一样的(看inside(),outside()及其bytecode)。
2. 对于不会被在循环内修改的变量。
2.1 定义在循环体外和循环体内是不一样,定义在体外将会高效一点(noChangeInside(), noChangeOutside())。
2.2 定义在循环体外和循环初始化列表是一样的(noChangeOutside(), noChangeInFor())。
选择:
1. 对于会被修改的变量,尽量放到循环体内去定义。
2. 对于不会被修改的变量,尽量放到循环体外或for的初始化列表定义。
public class LoopVaribleDeclare { public void inside() { for (int i = 0; i < 10; ++i) { int inside; inside = i; System.out.println(inside); } } public void outside() { int outside; for(int i = 0; i < 10; ++i) { outside = i; System.out.println(outside); } } public void noChangeInside() { for (int i = 0; i < 10; ++i) { int inside = 1; System.out.println(inside); } } public void noChangeInFor() { for (int i = 0, inFor = 1; i < 10; ++i) { System.out.println(inFor); } } public void noChangeOutside() { int outside = 1; for(int i = 0; i < 10; ++i) { System.out.println(outside); } } // 1. Field java/lang/System.out:Ljava/io/PrintStream; for //1 // 2. Method java/io/PrintStream.println:(I)V for //2 // inside() == outside() // public void inside(); public void outside(); // Code: Code: // 0: iconst_0 0: iconst_0 // 1: istore_1 1: istore_2 // 2: goto 17 2: goto 17 // 5: iload_1 5: iload_2 // 6: istore_2 6: istore_1 // 7: getstatic #15; //1 7: getstatic #15; //1 // 10: iload_2 10: iload_1 // 11: invokevirtual #21; //2 11: invokevirtual #21; //2 // 14: iinc 1, 1 14: iinc 2, 1 // 17: iload_1 17: iload_2 // 18: bipush 10 18: bipush 10 // 20: if_icmplt 5 20: if_icmplt 5 // 23: return 23: return // noChangeInside() != (noChangeInFor() == noChangeOutside()) // see line 2: , 4: // public void noChangeInside(); public void noChangeInFor(); // Code: Code: // 0: iconst_0 0: iconst_0 // 1: istore_1 1: istore_1 // 2: goto 17 2: iconst_1 // 5: iconst_1 3: istore_2 // 6: istore_2 4: goto 17 // 7: getstatic #15; //1 7: getstatic #15; //1 // 10: iload_2 10: iload_2 // 11: invokevirtual #21; //2 11: invokevirtual #21; //2 // 14: iinc 1, 1 14: iinc 1, 1 // 17: iload_1 17: iload_1 // 18: bipush 10 18: bipush 10 // 20: if_icmplt 5 20: if_icmplt 7 // 23: return 23: return // public void noChangeOutside(); // Code: // 0: iconst_1 // 1: istore_1 // 2: iconst_0 // 3: istore_2 // 4: goto 17 // 7: getstatic #15; //1 // 10: iload_1 // 11: invokevirtual #21; //2 // 14: iinc 2, 1 // 17: iload_2 // 18: bipush 10 // 20: if_icmplt 7 // 23: return }