什么时候我们应该使用+来连接字符串,什么时候首选StringBuilder?何时适合使用concat.
我听说StringBuilder更适合循环中的连接.为什么会这样?
谢谢.
Sau*_*abh 48
现代Java编译器通过StringBuilder的追加转换你的+操作.我的意思是说,如果你这样做str = str1 + str2 + str3
,编译器将生成以下代码:
StringBuilder sb = new StringBuilder();
str = sb.append(str1).append(str2).append(str3).toString();
Run Code Online (Sandbox Code Playgroud)
您可以使用DJ或Cavaj对代码进行反编译来确认这一点:)所以现在使用+或StringBuilder更多的是选择而不是性能优势:)
但是考虑到编译器没有为您执行此操作的情况(如果您使用任何私有Java SDK来执行此操作,那么可能会发生这种情况),那么当您最终避免使用大量不必要的String
对象时,必然会使用StringBuilder .
NPE*_*NPE 32
我倾向于StringBuilder
在性能受到关注的代码路径上使用.循环内的重复字符串连接通常是一个很好的候选者.
喜欢的理由StringBuilder
是,无论+
和concat
创建新的对象每次调用时(提供的右手边参数不为空).这可以很快加起来很多对象,几乎所有对象都是完全没必要的.
正如其他人所指出的,当你+
在同一个语句中多次使用时,编译器通常可以为你优化这个.但是,根据我的经验,当连接发生在单独的语句中时,此参数不适用.它肯定对循环没有帮助.
说完这一切之后,我认为最重要的应该是编写清晰的代码.有一些很棒的分析工具可用于Java(我使用YourKit),这使得很容易找出性能瓶颈并优化重要的位.
PS我从来不需要使用concat
.
dim*_*902 17
来自Java/J2EE Job Interview Companion:
String
String
是不可变的:您不能修改String
对象,但可以通过创建新实例来替换它.创建新实例相当昂贵.Run Code Online (Sandbox Code Playgroud)//Inefficient version using immutable String String output = "Some text"; int count = 100; for (int i = 0; i < count; i++) { output += i; } return output;
上面的代码将构建99个新
String
对象,其中98个将立即被丢弃.创建新对象效率不高.
StringBuffer
/StringBuilder
StringBuffer
是可变的:使用StringBuffer
或StringBuilder
当你想修改内容时.StringBuilder
在Java 5中添加了它,它在所有方面都是相同的,StringBuffer
除了它不是同步的,这使得它更快,但代价是不是线程安全的.Run Code Online (Sandbox Code Playgroud)//More efficient version using mutable StringBuffer StringBuffer output = new StringBuffer(110); output.append("Some text"); for (int i = 0; i < count; i++) { output.append(i); } return output.toString();
上面的代码只创建了两个新对象,即返回
StringBuffer
的finalString
.StringBuffer
根据需要扩展,但这是昂贵的,因此最好StringBuffer
从一开始就用正确的大小初始化,如图所示.
如果所有连接元素都是常量(例如:) "these" + "are" + "constants"
,那么我更喜欢+,因为编译器会为你内联连接.否则,使用StringBuilder是最有效的方法.
如果对非常量使用+,编译器也将在内部使用StringBuilder,但调试变得很糟糕,因为使用的代码不再与源代码相同.
我的建议如下:
+
:在连接 2 或 3 个字符串时使用,只是为了保持代码简洁和可读。StringBuilder
:在构建复杂的字符串输出或关注性能时使用。String.format
:您在问题中没有提到这一点,但这是我创建字符串的首选方法,因为在我看来,它使代码最具可读性/简洁性,并且对于日志语句特别有用。concat
:我认为我没有理由使用这个。 归档时间: |
|
查看次数: |
81233 次 |
最近记录: |