2017-02-16 43 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