「コードはそう書いてないの?」について

2781 ワード

テストプログラムを書きました.
 
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命令が増えた.