JDK1.5加入泛型以后,传统的for语法也有了新变化。至于详细的区别倒还真没仔细研究,最进和人无意中提到这个问题,哑巴了。
上网搜搜了似乎没有详细的解释,于是好好分析了下,传统for和泛型for的都不陌生,写法如下:
public static void indexFor(int[] ixs) {
for (int i = 0; i < ixs.length; i++) {
ixs[i] = 3;
}
}
public static void genericFor(int[] ixs) {
for (int i : ixs) {
i = 5;
}
}
然后看字节码,先看看传统for语法的字节码:
public static void indexFor(int[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 18
8: aload_0
9: iload_1
10: iconst_3
11: iastore
12: iinc 1, 1
15: goto 2
18: return
从第10和11步的指令可以看出,旧的写法是直接操作修改数组的元素的。
下面看看泛型for语法的字节码:
public static void genericFor(int[]);
Code:
0: aload_0
1: astore_1
2: aload_1
3: arraylength
4: istore_2
5: iconst_0
6: istore_3
7: iload_3
8: iload_2
9: if_icmpge 26
12: aload_1
13: iload_3
14: iaload
15: istore 4
17: iconst_5
18: istore 4
20: iinc 3, 1
23: goto 7
26: return
从第15,17,18步的指令可以看出,泛型for语法代码修改的只是局部变量表中的属性。 不涉及原数组,所以对于java基本类型和String类型来说,想直接修改数组元素是不行的。
如果懒得看字节码,那么只需要将indexFor方法修改如下:
public static void indexFor(int[] ixs) {
int[] iii = ixs;
int x = iii.length;
for (int i = 0; i < x; i++) {
int ne = ixs[i];
ne = 5;
}
此时,indexFor方法编译出的字节码和genericFor方法的字节码就一模一样了,即对于编译器来说,用传统for语法这么写和用泛型for语法是一样的。
这样应该好理解了。