首页 / 资讯中心 / 文章详情

两段Java程序的效率

两段Java程序的效率 ★ FEATURED ARTICLE
这是很多年前的一篇旧闻我把它格式调整了一下// 代码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.init7: astore_1 //局部变量赋值result2 new ArrayList();8: aconst_null //局部变量赋值o null9: astore_210: iconst_0 //局部变量赋值i 011: istore_312: iload_3 //比较i和1013: bipush 1015: if_icmpge 45 //如果i 10 函数返回18: new #5; //new Obj()21: dup //将新创建的Obj的引用复制并压入栈22: invokespecial #6; //编译器插入的Obj初始化方法 Method init25: astore_2 //局部变量赋值o new Obj();26: aload_2 //准备调用参数栈取出局部变量的引用并压栈: o27: iload_3 //准备调用参数栈取出局部变量的值并压栈i28: invokevirtual #7; //方法调用o.set(i);31: aload_1 //取出局部变量的引用并压栈: result232: aload_2 //取出局部变量的引用并压栈: o33: invokeinterface #8, 2; //调用List.add()方法: result2.add(o);38: pop39: iinc 3, 1 //i42: goto 12 //回到for循环头45: return //函数返回-----------------------------------------------------------------------第3段代码反汇编及说明-----------------------------------------------------------------------0: new #3; //new ArrayList()3: dup /将新创建的ArrayList的引用复制并压入栈4: invokespecial #4; //编译器插入的ArrayList初始化方法ArrayList.init7: astore_1 /局部变量赋值result3 new ArrayList();8: iconst_0 //局部变量赋值i 09: istore_210: iload_2 //比较i和1011: bipush 1013: if_icmpge 43 //如果i 10 函数返回16: new #5; //new Obj()19: dup //将新创建的Obj的引用复制并压入栈20: invokespecial #6; //编译器插入的Obj初始化方法 Method init23: astore_3 //局部变量赋值o new Obj();24: aload_3 //准备调用参数栈取出局部变量的引用并压栈: o25: iload_2 //准备调用参数栈取出局部变量的值并压栈i26: invokevirtual #7; //方法调用o.set(i);29: aload_1 //取出局部变量的引用并压栈: result330: aload_3 //取出局部变量的引用并压栈: o31: invokeinterface #8, 2; //调用List.add()方法: result3.add(o);36: pop37: iinc 2, 1 //i40: goto 10 //回到for循环头43: return //函数返回-----------------------------------------------------------------------小结1、代码2效率显然不如代码3红色那两行是多余的。2、代码2可维护性比较差前面有说明。代码2与代码3的差异除了多了那两句就是局部变量的索引顺序不同循环体的反汇编也是完全一样的。所以代码2各方面都不如代码3一般推荐3的写法。这与大多数人日常编码习惯是一致的
阅读完成 · 觉得有帮助?
咨询建站