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

 

    这样应该好理解了。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值