「コードはそう書いてないの?」について
2781 ワード
テストプログラムを書きました.
「コードって書いてあるんじゃないの?」の招待状の中でm 1とm 2のどの書き方がもっと優れていることに関心を持っています.
上のプログラムを逆コンパイルしましたが、実際にはm 1とm 2しか関心がないので、下にはバイトコードの一部しか貼られていません.
private static void m2(List list)
上記の2つの方法を比較すると、カウンタとオブジェクトが参照する変数テーブルで下の位置を交換していることがわかります.
善し悪しを区別しなければならない場合、m 2は変数を外に定義しnullに初期化し、かえって2つのbytecode命令が増えた.
import java.util.ArrayList;
import java.util.List;
public class TestFor {
private static void m1(List list) {
for(int i=0;i<10;i++)
{
Object ox = new Object();
list.add(ox);
}
}
private static void m2(List list) {
Object o = null;
for(int i=0;i<10;i++)
{
o = new Object();
list.add(o);
}
}
public static void main(String[] args) {
Object[] array = new Object[10];
List list = new ArrayList();
m2(list);
m1(list);
}
}
「コードって書いてあるんじゃないの?」の招待状の中でm 1とm 2のどの書き方がもっと優れていることに関心を持っています.
上のプログラムを逆コンパイルしましたが、実際にはm 1とm 2しか関心がないので、下にはバイトコードの一部しか貼られていません.
private static void m2(List list)
{
// 0 0:aconst_null
// 1 1:astore_1
// 2 2:iconst_0
// 3 3:istore_2
// 4 4:goto 26
// 5 7:new #3 <Class Object>
// 6 10:dup
// 7 11:invokespecial #8 <Method void Object()>
// 8 14:astore_1
// 9 15:aload_0
// 10 16:aload_1
// 11 17:invokeinterface #32 <Method boolean List.add(Object)>
// 12 22:pop
// 13 23:iinc 2 1
// 14 26:iload_2
// 15 27:bipush 10
// 16 29:icmplt 7
// 17 32:return
}
private static void m1(List list)
{
// 0 0:iconst_0
// 1 1:istore_1
// 2 2:goto 24
// 3 5:new #3 <Class Object>
// 4 8:dup
// 5 9:invokespecial #8 <Method void Object()>
// 6 12:astore_2
// 7 13:aload_0
// 8 14:aload_2
// 9 15:invokeinterface #32 <Method boolean List.add(Object)>
// 10 20:pop
// 11 21:iinc 1 1
// 12 24:iload_1
// 13 25:bipush 10
// 14 27:icmplt 5
// 15 30:return
}
上記の2つの方法を比較すると、カウンタとオブジェクトが参照する変数テーブルで下の位置を交換していることがわかります.
善し悪しを区別しなければならない場合、m 2は変数を外に定義しnullに初期化し、かえって2つのbytecode命令が増えた.