我有一个如下所示的巨大字符串:
String str = "aaaaaaa"
+ "bbbbbbbb"
+ "cccccccc"
....
+ "zzzzzzzz"; // about 200 lines long
这会浪费很多内存吗?是把它放在一行中还是使用 StringBuilder
更好呢? 这是为了创建一个长的sql语句。
我有一个如下所示的巨大字符串:
String str = "aaaaaaa"
+ "bbbbbbbb"
+ "cccccccc"
....
+ "zzzzzzzz"; // about 200 lines long
这会浪费很多内存吗?是把它放在一行中还是使用 StringBuilder
更好呢? 这是为了创建一个长的sql语句。
不会。如果您的所有字符串都是常量(如您的问题中一样),编译器将在编译时执行连接操作,这比使用StringBuilder
版本性能更好。
否则,它将使用StringBuilder
(或StringBuffer
)来执行任何非常量部分的连接操作。
因此,以下代码的编译版本为:
String x = "a" + "b";
应该完全与以下内容相同:
String x = "ab";
请注意,“非常数”部分可能意味着您有时可以通过明智地使用括号获得(非常小的)额外效率。例如:
请注意,“非常数”部分可能意味着您有时可以通过明智地使用括号获得(非常小的)额外效率。例如:
int value = ...;
String x = "a" + value + "b" + "c";
...不如以下方式效率更低:
int value = ...;
String x = "a" + value + ("b" + "c");
...作为第一个追加"b"
和"c"
的单独操作。高效版本等同于:
int value = ...;
String x = "a" + value + "bc";
我不记得曾经将其用作合法的微优化,但至少它是一个值得关注的点。
foo
的值,使得(foo + "a") + "b"
与foo + "ab"
不同? - Ilmari Karonen+
(连接)操作都会自动编译为StringBuilder
的append()
操作。然而,如果它在循环内部,它会为每次迭代创建一个新的 StringBuilder
,从而抵消其效果-因此你最好明确地管理 StringBuilder
。StringBuilder
。String
,而不使用 StringBuilder
。 - Louis Wasserman代码:
String str = "aaaaaaa" + "bbbbbbbb" + "cccccccc";
在编译时,gets被转换为:
String str = (new StringBuilder()).append("aaaaaaa").append("bbbbbbbb").append("cccccccc").toString();
因此,使用StringBuilder似乎没有任何区别。
有一篇非常好的文章,详细比较了concat(+)与StringBuilder和StringBuffer的性能,包括线性图表:
StringBuilder vs StringBuffer vs String.concat - Done Right。