构建没有+运算符的长字符串文字

时间:2013-09-27 11:19:00

标签: java string performance string-concatenation

人。我想知道它是否有可能在Java中。我想记录一个长字符串消息。例如

“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”

但为了保持我的源代码可读,我不想把它写在一行,因为否则任何代码阅读器都必须一直滚动。所以我把它写成了

“aaaaaaaaaaa”+
“aaaaaaaaaaaaaaaaa”+ “aaaaaaaaaaaaaaaaa”

但是,由于Java为每个字符串创建一个新对象,并且为了连接它会创建更多临时对象,因此这种表示法会产生大量开销。该构造在我的代码中处于循环中,因此性能问题非常重要。

还有其他方法可以有效地编写字符串吗?我在网上搜索但除了使用StringBuffer之外没有找到任何东西。

BR Ewgenij

3 个答案:

答案 0 :(得分:2)

如果字符串在编译时已知,它们将自动连接,因此您根本不会受到任何处罚。

如果字符串是在运行时生成的,请使用StringBuilder(而不是StringBuffer,由于同步开销,速度会慢一些。)

答案 1 :(得分:0)

If the string can be evaluated at compile time,编译器将负责为您组合它们。如果您在运行时构建长字符串,请使用StringBuilder

以下是编译器在编译时如何处理串联的示例:

<强>来源

String foo = "asdf" + "fdsa";

类文件

Constant pool:
 #1 = Methodref          #6.#17         //  java/lang/Object."<init>":()V
 #2 = String             #18            //  asdffdsa
...
#18 = Utf8               asdffdsa

答案 2 :(得分:0)

StringBuilder builder = new StringBuilder("aaaaaaaaaaa");
builder.append("aaaaaaaaaaaaaaaaaa");
builder.append("aaaaaaaaaaaaaaaaa");

builder.toString(); //This returns "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

但是,在您的情况下,使用硬编码字符串,执行

String msg = "aaaaaaa" +
"aaaaaaa" +
"aaaaaaa"

将编译成

String msg = "aaaaaaaaaaaaaaaaaaaaa";