Java 字符串串联-值是否为

Java 字符串串联-值是否为,java,string,Java,String,所以我只是仔细阅读了一会儿,这里所有关于.valueOf字符串的不同问题,但它们似乎都是关于转换的。将.valueOf与+“进行比较 我想知道它是否值得,或者如果它是一个串联,是否有必要使用.valueOf 示例: LOGGER.info("Final Score: " + String.valueOf(Math.round(finalScore * 100)) + "%"); VS LOGGER.info("Final Score: " + Math.round(finalScore * 1

所以我只是仔细阅读了一会儿,这里所有关于
.valueOf
字符串的不同问题,但它们似乎都是关于转换的。将
.valueOf
与+
进行比较

我想知道它是否值得,或者如果它是一个串联,是否有必要使用
.valueOf

示例:

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

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

似乎使用
String.valueOf
是不必要的,如果您有实际的字符串。我知道如果您只是转换它并打算使用空字符串,那么使用
.valueOf
可能会更好。

您是正确的。组合字符串和其他数据类型时,不需要valueOf。对于一个int,我认为工作的价值,但有趣的是,第二个例子更常见

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

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

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

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

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}
因此
valueOf
toString
之间的唯一区别是
valueOf
是空安全的。那么让我们看看如果我们连接一个字符串和一个对象,会使用哪一个

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
之间似乎没有任何区别。

当我们串接字符串时,编译器实际上会将其转换为

和的底层实现最终都会调用,除了在
String.valueOf()
的情况下,首先调用
Integer.toString(int)


总之,对于给定的场景,直接连接将是一种可行的方法。但是,如果您想了解内存,那么请先使用字符串生成器连接值,然后记录它。

我想知道在上下文中,在实际字符串上添加另一种值类型,而不仅仅是用于转换的空字符串。因此,如果您已经输出了文本,valueOf将只是行中的更多代码,但是没有做任何不同的事情,因为它已经在幕后使用了toString。使它有点冗余?我同意,是的。因此,即使您使用这两种方法中的一种而不是直接连接,StringBuffer.append实际上会更好,因为它只需要一个步骤?是的,因为在这种情况下,您将帮助编译器不必再这样做。