Java 哪个代码段执行得更快?

Java 哪个代码段执行得更快?,java,android,Java,Android,我可以通过两种类型的代码片段做同样的事情 第一种方式: String makeDate = Integer.toString(now.year) + Integer.toString(now.month) + Integer.toString(now.monthDay); 或者第二种方式: String makeDate = now.year + "" + now.month + "" + now.monthDay; 我的问题是: 哪种方法更可取[第一种方法还是第二种方法] 哪个代码段执行得

我可以通过两种类型的代码片段做同样的事情

第一种方式:

String makeDate = Integer.toString(now.year) + Integer.toString(now.month) + Integer.toString(now.monthDay);
或者第二种方式:

String makeDate = now.year + "" + now.month + "" + now.monthDay;
我的问题是:

  • 哪种方法更可取[第一种方法还是第二种方法]
  • 哪个代码段执行得更快

  • 你展示的两个鼻涕虫几乎一模一样

    Java中的
    字符串是不可变的;这是无法改变的。当使用串联运算符(
    +
    )时,编译器实际上使用
    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(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        
    
    publicstaticvoidmain(java.lang.String[]);
    标志:ACC_公共,ACC_静态
    代码:
    堆栈=2,局部变量=3,参数大小=1
    0:iconst_1
    1:istore_1
    2:new#2//类java/lang/StringBuilder
    5:dup
    6:invokespecial#3//方法java/lang/StringBuilder。”“:()V
    9:iload_1
    10:invokevirtual#4//方法java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
    13:ldc#5//String
    15:invokevirtual#6//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
    18:iload_1
    19:invokevirtual#4//方法java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
    22:ldc#5//String
    24:invokevirtual#6//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
    27:iload_1
    28:invokevirtual#4//方法java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
    31:invokevirtual#7//方法java/lang/StringBuilder.toString:()Ljava/lang/String;
    34:astore_2
    35:getstatic#8//fieldjava/lang/System.out:Ljava/io/PrintStream;
    38:aload_2
    39:invokevirtual#9//方法java/io/PrintStream.println:(Ljava/lang/String;)V
    42:返回
    

    从技术上讲,后者可能在一些几乎无法测量(<1ns)的规模上更快,但对于所有实际目的来说,这并不重要;用你喜欢的任何东西。

    用你觉得最可读的东西。您需要执行数十亿次才能注意到差异。它们都将在固定时间内执行,因此执行时间肯定不会成为问题。。。。。在我看来,第二种方式更优雅,没有必要包装任何东西。
    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