-1

2 種類のコード スニペットで同じことができます。

最初の方法:

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

または第二の方法:

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

私の質問は:

  1. [第一の方法と第二の方法] どちらの方法が望ましいですか?
  2. どのコード スニペットがより速く実行されますか?
4

1 に答える 1

5

表示される 2 つのスニペットはほぼ同じです。

StringJavaの aは不変です。変更することはできません。連結演算子 ( +) を使用する場合、コンパイラは実際にStringBuilder

たとえば、2 番目のスニピットは次のようになります。

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) でより高速ですが、すべての実用的な目的では問題ではありません。好きな方を使ってください。

于 2013-07-21T14:51:06.300 に答える