String.format() vs “+” 运算符

基本字符串串联操作应该使用什么?

String randomString = "hello " + userName + " how are you" ?

String randomString = String.format("hello %s how are you ?",userName);

我觉得可以更好地了解输出字符串。但是,使用其中任何一个实际上的利弊是什么?String.format()

字符串文本池中是否存在性能或孤立条目方面的内容。

编辑:我说的是字符串中的多个参数,而不仅仅是一个。约5 +。

奖金问题:也请分享您对实际应该使用哪一个的看法?其中任何一个或第三个... !!?


答案 1

如果你只在寻找性能,我相信使用是构建字符串的最有效方法。即使Java编译器足够聪明,可以将大多数字符串串联转换为等效的字符串。StringBuilder/StringBufferStringBuilder

如果您正在寻找可读性,那么我认为事情会更清晰,除非我需要依赖高性能,否则这也是我使用的。String.format

因此,如果您主要关注的不是性能,这意味着此代码不在调用很多的路径中,您可能更喜欢使用,因为它可以更好地了解生成的字符串(如您所说)。String.format

此外,使用可以让你使用格式的东西,这意味着你可以用它来填充字符串,格式化数字,日期等,如果使用简单的串联,这将使代码变得更糟。String.format

编辑 Chuu

使用 JAD,您可以看到以下代码:

public class Test {
    public static void main(String[] args) {
        String str = "a" + "b" + "c";
        String str2 = "foo" + str + "bar" + str;
        System.out.println(str2);
    }
}

反编译时将如下所示:

public class Test {
    public static void main(String[] args) {
        String str = "abc";
        String str2 = new StringBuilder("foo").append(str).append("bar").append(str).toString();
        System.out.println(str2);
    }
}

也可以使用实用程序找到证明,该实用程序将在文件下显示Java字节码:javap.class

public static void main(java.lang.String[] args);
    0  ldc <String "abc"> [16]
    2  astore_1 [str]
    3  new java.lang.StringBuilder [18]
    6  dup
    7  ldc <String "foo"> [20]
    9  invokespecial java.lang.StringBuilder(java.lang.String) [22]
   12  aload_1 [str]
   13  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
   16  ldc <String "bar"> [29]
   18  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
   21  aload_1 [str]
   22  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
   25  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [31]
   28  astore_2 [str2]
   29  getstatic java.lang.System.out : java.io.PrintStream [35]
   32  aload_2 [str2]
   33  invokevirtual java.io.PrintStream.println(java.lang.String) : void [41]
   36  return

答案 2

基本字符串串联操作应该使用什么?

您提供的示例具有不同的用途。 被重载以连接 s,但用于格式化字符串,如 name 指定。+StringString.format

将字符串连接在一起不是主要工作。

因此,如果要求只是连接使用或连接方法。+

这些链接将非常有用:

如果性能很重要,我应该使用Java的String.format()吗?

在Java中使用String.format而不是字符串串联是更好的做法吗?