2013-07-21 49 views
-1

我可以通过两种类型的代码片段来做同样的事情。哪个代码片段执行速度更快?

第一种方式:

String makeDate = Integer.toString(now.year) + Integer.toString(now.month) + Integer.toString(now.monthDay); 

或者第二种方式:

String makeDate = now.year + "" + now.month + "" + now.monthDay; 

我的问题是:

  1. 哪种方法最好[第一种方式还是第二种方法]
  2. 哪个代码片段执行速度会更快?
+3

使用任何您发现最具可读性的东西。您需要执行这十亿次和数十亿次才能发现差异。 –

+0

他们都会在恒定的时间执行,因此执行时间肯定不会成为问题.....说了第二种方式在我看来更优雅,没有必要包装任何东西。 – HCL02

回答

5

您显示的两个小窍门几乎完全相同。

a String in Java is immutable;它不能改变。当使用连接符(+)编译器使用StringBuilder

例如你的第二个SNIPPIT变成实际生成代码:

String makeDate = new StringBuilder() 
        .append(now.year) 
        .append("") 
        .append(now.month) 
        .append("") 
        .append(now.monthDay) 
        .toString(); 

你可以看一下生成的字节码看到这一点。 Java附带一个程序javap,它允许您查看编译的.class

我创建了一个简单main()提供最小的字节码:

public static void main(String[] args) 
{ 
    String makeDate = Integer.toString(1) + Integer.toString(1) + Integer.toString(1); 
    System.out.println(makeDate); 
} 

主要生产:

public static void main(java.lang.String[]); 
    flags: ACC_PUBLIC, ACC_STATIC 
    Code: 
     stack=2, locals=2, args_size=1 
     0: new   #2     // class java/lang/StringBuilder 
     3: dup   
     4: invokespecial #3     // Method java/lang/StringBuilder."<init>":()V 
     7: iconst_1  
     8: invokestatic #4     // Method java/lang/Integer.toString:(I)Ljava/lang/String; 
     11: invokevirtual #5     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     14: iconst_1  
     15: invokestatic #4     // Method java/lang/Integer.toString:(I)Ljava/lang/String; 
     18: invokevirtual #5     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     21: iconst_1  
     22: invokestatic #4     // Method java/lang/Integer.toString:(I)Ljava/lang/String; 
     25: invokevirtual #5     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     28: invokevirtual #6     // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
     31: astore_1  
     32: getstatic  #7     // Field java/lang/System.out:Ljava/io/PrintStream; 
     35: aload_1  
     36: invokevirtual #8     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     39: return  

对战:

public static void main(String[] args) 
{ 
    int i = 1; 
    String makeDate = i + "" + i + "" + i; 
    System.out.println(makeDate); 
} 

产地:

public static void main(java.lang.String[]); 
    flags: ACC_PUBLIC, ACC_STATIC 
    Code: 
     stack=2, locals=3, args_size=1 
     0: iconst_1  
     1: istore_1  
     2: new   #2     // class java/lang/StringBuilder 
     5: dup   
     6: invokespecial #3     // Method java/lang/StringBuilder."<init>":()V 
     9: iload_1  
     10: invokevirtual #4     // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 
     13: ldc   #5     // String 
     15: invokevirtual #6     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     18: iload_1  
     19: invokevirtual #4     // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 
     22: ldc   #5     // String 
     24: invokevirtual #6     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     27: iload_1  
     28: invokevirtual #4     // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 
     31: invokevirtual #7     // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
     34: astore_2  
     35: getstatic  #8     // Field java/lang/System.out:Ljava/io/PrintStream; 
     38: aload_2  
     39: invokevirtual #9     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     42: return   

技术上后者可能在某种程度上更快,几乎不可测量(< 1ns),但对于所有实际目的而言并不重要;使用你喜欢的任何一个。

相关问题