关于“代码难道不是这么写的?”

我写了个测试程序。

 

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);
	
		
		
	}



}
 

“代码难道不是这么写的?”的帖子里就是关心m1和m2哪个写法更优.


我反编译了上面的程序,由于我们实际只关心m1和m2,所以下面只贴出部分字节码


   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          
    }
 
对比上面两个方法,可以发现基本一样,就是计数器和对象引用的在变量表中交换了下位置。

如果非要分出个好坏,m2把变量定义在外面,并初始化为null,反而多了两个bytecode指令。


你可能感兴趣的:(代码)