2011-10-13 179 views
40

級聯我用Java代碼優化我的工作。我不清楚String.valueOf+""標誌的區別:字符串的valueOf VS空字符串

int intVar = 1; 
String strVar = intVar + ""; 
String strVar = String.valueOf(intVar); 

是什麼線2和3之間的區別?

+0

可能重複[Is conversion to String using(「」+ )bad practice?](http://stackoverflow.com/questions/1572708/is-conversion-to-string-using-int-value-bad -practice) – Necreaux

回答

54
public void foo(){ 
int intVar = 5; 
String strVar = intVar+"";  
} 

這種方法使用StringBuilder的創建結果字符串

public void foo(); 
    Code: 
    0: iconst_5 
    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/lan 
g/StringBuilder; 
    13: ldc  #5; //String 
    15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/ 
String;)Ljava/lang/StringBuilder; 
    18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/la 
ng/String; 
    21: astore_2 
    22: return 

public void bar(){ 
int intVar = 5; 
String strVar = String.valueOf(intVar); 
} 

這種方法調用的String只是一個靜態方法來獲得INT

public void bar(); 
    Code: 
    0: iconst_5 
    1: istore_1 
    2: iload_1 
    3: invokestatic #8; //Method java/lang/String.valueOf:(I)Ljava/lang/Stri 
ng; 
    6: astore_2 
    7: return 
String版本

,接着調用Integer.toString()

5

我寧願valueOf(),因爲我認爲這是更具可讀性和明確的。

對性能有任何疑慮是微優化,而這無法衡量。我不會擔心他們,直到我可以進行測量,並看到他們有所作爲。

3

第一行是相當於

String strVal = String.valueOf(intVar) + ""; 

,以便有一些額外的(和毫無意義的)工作要做。不確定編譯器是否優化了與空字符串文字的連接。如果沒有(和看着@ Jigar的回答它顯然並非如此),這將反過來成爲

String strVal = new StringBuilder().append(String.valueOf(intVar)) 
         .append("").toString(); 

那麼你真的應該直接使用將String.valueOf。

18

問自己代碼的目的。它是:

  • 串聯一個空字符串值
  • 的值轉換爲字符串

它更像後者的聲音,我...這就是爲什麼我會使用String.valueOf。無論何時你可以用你描述你想要實現的相同方式來閱讀你的代碼,這是一件好事。

請注意,這適用於所有類型和傳遞空引用,而不是拋出NullPointerException將返回「零」。如果您使用的是類(而不是int如本例),你它,如果它是空拋出一個異常(例如因爲這代表了一個bug),請參考toString代替。

+2

'String.valueOf(int x)'*僅調用String的靜態方法來獲取int *的String版本。當我們談論Android時,建議*避免*使用靜態方法。您如何看待Android中的這種方法? – Machado

1

連接字符串和其他變量的實際使用String.valueOf()(和StringBuilder)之下,因此編譯器將有望丟棄空字符串,並且產生在兩種情況下相同的字節碼。

+0

看@ @ Jigar的答案顯然不會做這種優化 – Thilo

+1

@Thilo:雖然有多個Java編譯器。 –

0

從優化的角度來看,我會一直喜歡兩者之間的String.valueOf()。第一種是隻是一個黑客,試圖欺騙intVar轉換成一個String,因爲+運算符。

-1
String strVar1 = intVar+""; 
String strVar2 = String.valueOf(intVar); 

strVar1等同放着清單strVar2,但使用INT + emptyString 「」 不優雅的方式來做到這一點。

使用valueOf更有效。

7

使用String.valueOf(int)或更好,Integer.toString(int)是相對更有效的機器。但是,除非性能很關鍵(在這種情況下,我不建議你使用)然後""+ x更有效地利用你的時間。恕我直言,這通常更重要。有時候更重要。

換句話說,""+浪費了一個對象,但Integer.toString()創建了幾個。無論你的時間更重要還是想避免不惜一切代價創建對象。你不太可能會創建多個對象是好的,但創建一個對象不是。

+0

好的短語:「那麼」「+ x更有效地利用你的時間,恕我直言,這通常更重要。」 – teddy