人。我想知道它是否有可能在Java中。我想记录一个长字符串消息。例如
“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”
但为了保持我的源代码可读,我不想把它写在一行,因为否则任何代码阅读器都必须一直滚动。所以我把它写成了
“aaaaaaaaaaa”+
“aaaaaaaaaaaaaaaaa”+
“aaaaaaaaaaaaaaaaa”
但是,由于Java为每个字符串创建一个新对象,并且为了连接它会创建更多临时对象,因此这种表示法会产生大量开销。该构造在我的代码中处于循环中,因此性能问题非常重要。
还有其他方法可以有效地编写字符串吗?我在网上搜索但除了使用StringBuffer之外没有找到任何东西。
BR Ewgenij
答案 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";