String.format()vs"+"运算符

Pri*_*shi 21 java string concatenation string-concatenation

什么应该用于基本的字符串连接操作?

String randomString = "hello " + userName + " how are you" ?
Run Code Online (Sandbox Code Playgroud)

要么

String randomString = String.format("hello %s how are you ?",userName);
Run Code Online (Sandbox Code Playgroud)

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

字符串文字池中的性能或孤立条目是否有任何内容.

编辑:我在谈论字符串中的多个参数,而不只是一个.大约5 +.

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

Ale*_*lex 22

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

如果你正在寻找可读性,String.format我认为事情就更清晰了,除非我需要依靠高性能,否则我也会使用它.

因此,如果您的主要关注点不是性能,这意味着此代码不在一个被调用的路径中,您可能更愿意使用,String.format因为它可以更好地了解生成的String(就像您所说的那样).

此外,使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

反编译时看起来像:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


Evg*_*eev 8

尝试这个

    long t0 = System.currentTimeMillis();
        String userName = "test";
        for (int i = 0; i < 1000000; i++) {
            String randomString = "hello " + userName + " how are you?";
//          String randomString = String.format("hello %s how are you ?",userName);
        }
        System.out.println(System.currentTimeMillis() - t0);
Run Code Online (Sandbox Code Playgroud)

您会惊讶地发现连接速度比 String.format 快 10 倍。但是 format 可以对数字、日期等做很多非常有用的事情。有关详细信息,请参阅 java.util.Formatter API,它实际上由 String.format 使用。

  • 性能测试+1 (2认同)

Azo*_*ous 7

什么应该用于基本的字符串连接操作?

您提供的示例服务器用途不同.+重载到concat,StringString.format用于格式化字符串,如name指定.

将字符串连接在一起并不是它的主要工作.

所以,如果要求只是连接使用+concat方法.

这些链接很有用:

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

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

  • 你不应该.但如果还需要格式化,则更喜欢`format`. (3认同)

归档时间:

查看次数:

27848 次

最近记录:

8 年,3 月 前