簡體   English   中英

String.valueOf(long a)和連接(“”+ a)之間的區別

[英]Difference between String.valueOf(long a) and concatenating (“” + a)

哪種方法更好,為什么?

如果我寫

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

要么

cmissValue = "" + callDBDatasource.cMiss();

該方法應該是什么?

"" + callDBDatasource.cMiss();

將編譯為:

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

這將創建一個新對象,因此速度明顯變慢。 看到這個問題: 字符串連接真的那么慢嗎?

這在這里很有用(“將數字轉換為字符串”部分): http//www.odi.ch/prog/design/newbies.php

不久:

    String.valueOf(callDBDatasource.cMiss());

對於那些感興趣的人,我已經為這兩種情況建模並為它們生成了字節碼。

這是第一個案例的程序:

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

這是你所期望的。

現在,這是一個建模第二種情況的程序:

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

如您所見,生成的字節碼比第一種情況多得多。 您還可以看到(在11到27之間) StringBuilder用於連接值,如接受的答案中所述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM