//代碼
public class Obj {
private int i;
public int getI() {
return i;
}
public void setI(int i) {
this
i = i;
}
}
//代碼
List result
= new ArrayList()
Obj o =null; ※
for(int i=
;i<
;i++){
o =new Obj()
※
o
setI(i)
result
add(o)
}
//代碼
List result
= new ArrayList()
for(int i=
;i<
;i++){
Obj o =new Obj()
o
setI(i)
result
add(o)
}
很多人的結論如下
)代碼
比代碼
的效率高
)代碼
的可維護性不如代碼
因為變量作用域擴大了
其實結論
)是錯誤的
第
段代碼反匯編及說明
: new #
; //new ArrayList()
: dup //將新創建的ArrayList的引用復制並壓入棧
: invokespecial #
; //編譯器插入的ArrayList初始化方法
ArrayList
<init>
: astore_
//局部變量賦值
result
= new ArrayList()
: aconst_null //局部變量賦值
o = null
: astore_
: iconst_
//局部變量賦值
i =
: istore_
: iload_
//比較i和
: bipush
: if_icmpge
//如果i >=
函數返回
: new #
; //new Obj()
: dup //將新創建的Obj的引用復制並壓入棧
: invokespecial #
; //編譯器插入的Obj初始化方法 Method
<init>
: astore_
//局部變量賦值
o = new Obj()
: aload_
//准備調用參數棧
取出局部變量的引用並壓棧
o
: iload_
//准備調用參數棧
取出局部變量的值並壓棧
i
: invokevirtual #
; //方法調用
o
set(i)
: aload_
//取出局部變量的引用並壓棧
result
: aload_
//取出局部變量的引用並壓棧
o
: invokeinterface #
; //調用List
add()方法
result
add(o)
: pop
: iinc
//i++
: goto
//回到for循環頭
: return //函數返回
第
段代碼反匯編及說明
: new #
; //new ArrayList()
: dup /將新創建的ArrayList的引用復制並壓入棧
: invokespecial #
; //編譯器插入的ArrayList初始化方法
ArrayList
<init>
: astore_
/局部變量賦值
result
= new ArrayList()
: iconst_
//局部變量賦值
i =
: istore_
: iload_
//比較i和
: bipush
: if_icmpge
//如果i >=
函數返回
: new #
; //new Obj()
: dup //將新創建的Obj的引用復制並壓入棧
: invokespecial #
; //編譯器插入的Obj初始化方法 Method
<init>
: astore_
//局部變量賦值
o = new Obj()
: aload_
//准備調用參數棧
取出局部變量的引用並壓棧
o
: iload_
//准備調用參數棧
取出局部變量的值並壓棧
i
: invokevirtual #
; //方法調用
o
set(i)
: aload_
//取出局部變量的引用並壓棧
result
: aload_
//取出局部變量的引用並壓棧
o
: invokeinterface #
; //調用List
add()方法
result
add(o)
: pop
: iinc
//i++
: goto
//回到for循環頭
: return //函數返回
小結
代碼
效率顯然不如代碼
紅色那兩行是多余的
代碼
可維護性比較差
馮勇強前面有說明
代碼
與代碼
的差異
除了多了那兩句
就是局部變量的索引順序不同
循環體的反匯編也是完全一樣的
所以
代碼
各方面都不如代碼
一般推薦
的寫法
這與大多數人日常編碼習慣是一致的
)
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25833.html