Java String.format()vs"+&引用;操作人员
基本字符串连接操作应该使用什么Java String.format()vs"+&引用;操作人员,java,string,concatenation,string-concatenation,Java,String,Concatenation,String Concatenation,基本字符串连接操作应该使用什么 String randomString = "hello " + userName + " how are you" ? 或 我觉得String.format()可以更好地理解输出字符串。 但是,使用其中任何一种方法,实际的利弊是什么呢 字符串文字池中是否存在性能或孤立项方面的问题 编辑:我指的是字符串中的多个参数,而不仅仅是一个。大约5+ 奖金问题:请在 究竟应该使用哪一种?其中任何一个或第三个 基本字符串连接操作应该使用什么 String randomStr
String randomString = "hello " + userName + " how are you" ?
或
我觉得String.format()
可以更好地理解输出字符串。
但是,使用其中任何一种方法,实际的利弊是什么呢
字符串文字池中是否存在性能或孤立项方面的问题
编辑:我指的是字符串中的多个参数,而不仅仅是一个。大约5+
奖金问题:请在
究竟应该使用哪一种?其中任何一个或第三个
基本字符串连接操作应该使用什么
String randomString = "hello " + userName + " how are you" ?
您提供的示例有不同的用途+
重载为concatString
s,但String。format
用于格式化字符串,如名称所示
将字符串连接在一起不是它的主要工作
因此,如果要求只是连接,请使用+
或方法
这些链接将非常有用:
就个人而言,我更喜欢使用格式,因为它看起来更好,而且我无法想象它会严重影响性能。如果您只考虑性能,我相信使用
StringBuilder/StringBuffer
是构建字符串的最有效方法。即使Java编译器足够聪明,可以将大多数字符串连接转换为等效的StringBuilder
如果您想了解可读性,String.format
这一点我认为更清晰,除非我需要依赖高性能,否则我也会使用这一点
因此,如果您主要关心的不是性能,这意味着此代码不在一个称为lot的路径中,那么您可能更喜欢使用String.format
,因为它可以更好地了解结果字符串(如您所说)
此外,使用String.format
可以使用格式,这意味着您可以使用它填充字符串、格式化数字、日期等,如果使用简单的连接,这将使代码更加糟糕
为Chuu编辑:
使用,您可以看到以下代码:
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);
}
}
也可以使用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
publicstaticvoidmain(java.lang.String[]args);
0最不发达国家[16]
2 astore_1[str]
3新java.lang.StringBuilder[18]
6次重复
7最不发达国家[20]
9调用特殊的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最不发达国家[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返回
大多数推荐使用StringBuffer的人都生活在过去。
当前的最佳实践是使用StringBuilder。但是这可能会改变,所以为什么不让编译器为您这样做呢?
当您只使用“+”时,编译器将选择besst当前实现,它甚至可以组合静态字符串(“foo”+“bar”将变成单个“foobar”)
我将显式分配StringBuilder的唯一位置是在循环中(在循环之前创建并在循环中使用)
如果对发生的情况有疑问,请检查生成的字节码
那么什么时候使用格式呢?当实际的格式非常复杂时,我会使用格式。但是您现在谈论的是简单的连接。试试这个
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);
long t0=System.currentTimeMillis();
字符串userName=“test”;
对于(int i=0;i<1000000;i++){
String randomString=“你好”+用户名+“你好吗?”;
//String randomString=String.format(“你好%s,你好吗?”,用户名);
}
System.out.println(System.currentTimeMillis()-t0);
您会惊讶地发现concatation比String.format快10倍。但是format可以对数字、日期等做很多非常有用的事情。有关详细信息,请参阅java.util.Formatter API,它实际上由String.format使用。我认为String.format更有效,因为它有以下优点
谢谢。我的两分钱:始终使用
String.format()
在这种情况下,国际化比风格或表现更令人担忧。因此,我总是使用String.format()
英文文本:“你好”+用户名+“你好吗?”
翻译成绝地武士:userName+“你好吗?你好!”
如果字符串是串联的,那么对翻译人员来说,改变词序即使不是不可能,也是很困难的。这个问题变得越来越严重,因为字符串中有更多的片段和更多的占位符。在我看来,请使用
+运算符
如果性能是一个问题,您应该使用StringBuilde
String var = "huge success.";
System.out.print( "I'm making a note here: " + var );
//System.out.print( "Printing: " + ); Syntax error!
System.out.print( String.format( "I'm making a note here: '%s'", var ) );
System.out.print( String.format( "I'm making a note here: '%s'" ) ); // runtime exception!
System.out.print( String.format( "I'm making a note here: '%d'", var ) ); // runtime exception!