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)
尝试这个
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 使用。
什么应该用于基本的字符串连接操作?
您提供的示例服务器用途不同.+重载到concat,String但String.format用于格式化字符串,如name指定.
将字符串连接在一起并不是它的主要工作.
所以,如果要求只是连接使用+或concat方法.
这些链接很有用:
如果性能很重要,我应该使用Java的String.format()吗?
在Java中使用String.format而不是字符串连接是更好的做法吗?
| 归档时间: |
|
| 查看次数: |
27848 次 |
| 最近记录: |