黑马程序员_两段Java程序的效率

-----------android培训java培训、java+3G学习型技术博客、期待与您交流!------------

 //代码1
   
    public class Obj {
   
    private int i;
   
    public int getI() {
   
    return i;
   
    }
   
    public void setI(int i) {
   
    this.i = i;
   
    }
   
    }
   
    //代码2
   
    List result2 = new ArrayList();
   
    Obj o =null; ※
   
    for(int i=0;i<10;i++){
   
    o =new Obj(); ※
   
    o.setI(i);
   
    result2.add(o);
   
    }
   
    //代码3
   
    List result3 = new ArrayList();
   
    for(int i=0;i<10;i++){
   
    Obj o =new Obj();
   
    o.setI(i);
   
    result3.add(o);
   
    }
   
    很多人的结论如下;
   
    1)代码2比代码3的效率高;
   
    2)代码2的可维护性不如代码3,因为变量作用域扩大了。
   
    其实结论1)是错误的。
   
    第2段代码反汇编及说明:
   
    -----------------------------------------------------------------------
   
    0:   new     #3;           //new ArrayList()
   
    3:   dup                   //将新创建的ArrayList的引用复制并压入栈
   
    4:   invokespecial   #4;   //编译器插入的ArrayList初始化方法:ArrayList."<init>"
   
    7:   astore_1              //局部变量赋值:result2 = new ArrayList();
   
    8:   aconst_null           //局部变量赋值:o = null
   
    9:   astore_2
   
    10:  iconst_0              //局部变量赋值:i = 0
   
    11:  istore_3
   
    12:  iload_3               //比较i和10
   
    13:  bipush  10
   
    15:  if_icmpge       45    //如果i >= 10 函数返回
   
    18:  new     #5;           //new Obj()
   
    21:  dup                   //将新创建的Obj的引用复制并压入栈
   
    22:  invokespecial   #6;   //编译器插入的Obj初始化方法 Method "<init>"
   
    25:  astore_2              //局部变量赋值:o = new Obj();
   
    26:  aload_2               //准备调用参数栈,取出局部变量的引用并压栈: o
   
    27:  iload_3               //准备调用参数栈,取出局部变量的值并压栈:i
   
    28:  invokevirtual   #7;   //方法调用:o.set(i);
   
    31:  aload_1               //取出局部变量的引用并压栈: result2
   
    32:  aload_2               //取出局部变量的引用并压栈: o
   
    33:  invokeinterface #8,  2;   //调用List.add()方法: result2.add(o);
   
    38:  pop
   
    39:  iinc    3, 1          //i++
   
    42:  goto    12            //回到for循环头
   
    45:  return                //函数返回
   
    -----------------------------------------------------------------------
   
    第3段代码反汇编及说明:
   
    -----------------------------------------------------------------------
   
    0:   new     #3;           //new ArrayList()
   
    3:   dup                   /将新创建的ArrayList的引用复制并压入栈
   
    4:   invokespecial   #4;   //编译器插入的ArrayList初始化方法:ArrayList."<init>"
   
    7:   astore_1              /局部变量赋值:result3 = new ArrayList();
   
    8:   iconst_0              //局部变量赋值:i = 0
   
    9:   istore_2
   
    10:  iload_2               //比较i和10
   
    11:  bipush  10
   
    13:  if_icmpge       43    //如果i >= 10 函数返回
   
    16:  new     #5;           //new Obj()
   
    19:  dup                   //将新创建的Obj的引用复制并压入栈
   
    20:  invokespecial   #6;   //编译器插入的Obj初始化方法 Method "<init>"
   
    23:  astore_3              //局部变量赋值:o = new Obj();
   
    24:  aload_3               //准备调用参数栈,取出局部变量的引用并压栈: o
   
    25:  iload_2               //准备调用参数栈,取出局部变量的值并压栈:i
   
    26:  invokevirtual   #7;   //方法调用:o.set(i);
   
    29:  aload_1               //取出局部变量的引用并压栈: result3
   
    30:  aload_3               //取出局部变量的引用并压栈: o
   
    31:  invokeinterface #8,  2;   //调用List.add()方法: result3.add(o);
   
    36:  pop
   
    37:  iinc    2, 1          //i++
   
    40:  goto    10            //回到for循环头
   
    43:  return                //函数返回
   
    -----------------------------------------------------------------------
   
    小结:
   
    1、代码2效率显然不如代码3,红色那两行是多余的。
   
    2、代码2可维护性比较差。
   
    代码2与代码3的差异,除了多了那两句,就是局部变量的索引顺序不同,循环体的反汇编也是完全一样的。所以,代码2各方面都不如代码3,一般推荐3的写法。这与大多数人日常编码习惯是一致的:)

-----------android培训java培训、java+3G学习型技术博客、期待与您交流!------------

详细请查看:http://net.itheima.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值