2017-02-16 45 views
4

所以我只用了一會兒,對這裏所有關於.valueOf的不同問題都用字符串,但它們都是關於轉換的。比較.valueOf只需+ ""String concatenation - valueOf or not

我想知道如果是串聯,它是否值得或者根本不需要使用.valueOf

例子:

LOGGER.info("Final Score: " + String.valueOf(Math.round(finalScore * 100)) + "%"); 

VS

LOGGER.info("Final Score: " + Math.round(finalScore * 100) + "%"); 

這好像使用String.valueOf是不必要的,如果你有實際的字符串與它一起去。我知道如果您只是將其轉換並打算使用空字符串,則最好使用.valueOf

回答

3

當我們連接字符串時,編譯器實際上將它翻譯爲StringBuffer.append()

的底層實現爲StringBuffer.append(int)String.valueOf(int)都最終結束了呼叫Integer.getChars(int,int,char[])不同之處在於在String.valueOf()情況下,存在於第一Integer.toString(int)呼叫。

總之,對於給定的場景,直接連接將是一條路。但是如果你打算關注內存,那麼首先使用字符串生成器來連接值,然後記錄它。

+0

因此,即使您使用這兩種方法之一而不是直接串聯,StringBuffer.append實際上會更好,因爲它只需要少一步? –

+1

是的,因爲在這種情況下,你會幫助編譯器不必再做一次。 –

0

你是對的。在組合字符串和其他數據類型時,valueOf不是必需的。對於只有一個int,我想的valueOf作品,但有趣的是,第二個例子是一個很大的共同

@Test 
public void testStringValueOF(){ 
    int num = 123; 

    // this works... 
    String test = String.valueOf(num); 

    // but this is more common 
    String test2 = "" + num; 
} 
+0

我想知道在上下文中將另一個值類型添加到實際字符串中,而不僅僅是用於轉換的空字符串。 –

1

String#valueOf(Object)源代碼如下所示:

public static String valueOf(Object obj) { 
    return (obj == null) ? "null" : obj.toString(); 
} 

所以之間的唯一區別valueOftoStringvalueOf是無效的。所以,讓我們看看在串聯一個字符串和一個對象時使用哪一個。

Object foo = null; 
System.out.println("foo " + foo); //foo null, no exception thrown 
System.out.println("foo " + String.valueOf(foo)); //foo null, no exception thrown 

所以看起來沒有任何區別串聯在這方面使用valueOf之間。

+0

因此,在已經有輸出文本的情況下,valueOf只會是更多的代碼,但不會做任何不同的事情,因爲它已經在幕後使用了toString。使它有點多餘? –

+1

我同意,是的。 – CollinD