`
wupuyuan
  • 浏览: 75871 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

for语法的学习

阅读更多

    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语法是一样的。

 

    这样应该好理解了。 

分享到:
评论
4 楼 wupuyuan 2012-04-08  
lingqi1818 写道
只是简单的语法糖啦,python,erlang之类的这种语法糖多的是啊。

呵呵,明白了就不难,不明白的时候就困惑呗。
3 楼 lingqi1818 2012-04-07  
只是简单的语法糖啦,python,erlang之类的这种语法糖多的是啊。
2 楼 wupuyuan 2012-03-27  
xiaozhao-521 写道
还有泛型for,这么一说呢?? 这个应该快速for循环吧

是在JDK 1.5加入泛型的时候一起加入的,姑且这么称呼吧,名字无所谓啦
1 楼 xiaozhao-521 2012-03-27  
还有泛型for,这么一说呢?? 这个应该快速for循环吧

相关推荐

Global site tag (gtag.js) - Google Analytics