2

どちらのアプローチが優れており、その理由は?

私が書いたら

cmissValue = String.valueOf(callDBDatasource.cMiss());

また

cmissValue = "" + callDBDatasource.cMiss();

アプローチはどうあるべきですか?

4

3 に答える 3

8
"" + callDBDatasource.cMiss();

次のようにコンパイルされます。

new StringBuilder().append("").append(callDBDatasource.cMiss()).toString();

これは新しいオブジェクトを作成するため、大幅に遅くなります。この質問を参照してください:文字列連結は本当に遅いですか?

于 2013-03-09T16:49:09.170 に答える
3

これはここで役に立ちます (セクション「数値を文字列に変換する」): http://www.odi.ch/prog/design/newbies.php

まもなく:

    String.valueOf(callDBDatasource.cMiss());
于 2013-03-09T16:52:21.703 に答える
2

興味のある方のために、私は両方のケースをモデル化し、それらのバイトコードを生成しました。

最初のケースのプログラムは次のとおりです。

import java.util.Random;

public class Test1 {
  public static void main(String[] args) {
    long l = new Random().nextLong();
    String s = String.valueOf(l);
    System.out.println(s);
  }
}

...そしてここにバイトコードがあります:

0:  new             #2; //class java/util/Random
3:  dup
4:  invokespecial   #3; //Method java/util/Random."<init>":()V
7:  invokevirtual   #4; //Method java/util/Random.nextLong:()J
10: lstore_1
11: lload_1
12: invokestatic    #5; //Method java/lang/String.valueOf:(J)Ljava/lang/String;
15: astore_3
16: getstatic       #6; //Field java/lang/System.out:Ljava/io/PrintStream;
19: aload_3
20: invokevirtual   #7; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
23: return

これはあなたが期待するものです。

次に、2 番目のケースをモデル化したプログラムを次に示します。

import java.util.Random;

public class Test2 {
  public static void main(String[] args) {
    long l = new Random().nextLong();
    String s = "" + l;
    System.out.println(s);
  }
}

...そしてここにバイトコードがあります:

0:  new             #2;  //class java/util/Random
3:  dup
4:  invokespecial   #3;  //Method java/util/Random."<init>":()V
7:  invokevirtual   #4;  //Method java/util/Random.nextLong:()J
10: lstore_1
11: new             #5;  //class java/lang/StringBuilder
14: dup
15: invokespecial   #6;  //Method java/lang/StringBuilder."<init>":()V
18: ldc             #7;  //String 
20: invokevirtual   #8;  //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: lload_1
24: invokevirtual   #9;  //Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
27: invokevirtual   #10; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: astore_3
31: getstatic       #11; //Field java/lang/System.out:Ljava/io/PrintStream;
34: aload_3
35: invokevirtual   #12; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
38: return

ご覧のとおり、最初のケースよりも多くのバイトコードが生成されています。StringBuilder受け入れられた回答に記載されているように、値を連結するためにa が使用されていることも (11 から 27 で) わかります。

于 2013-03-09T17:23:48.180 に答える