-3

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

“啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊”

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

“啊啊啊啊啊啊
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
啊啊啊啊啊啊啊”

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

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

BR Ewgenij

4

3 回答 3

2

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

如果字符串是在运行时生成的,请使用 a StringBuilder(不是 a StringBuffer,因为同步开销会比较慢)。

于 2013-09-27T11:23:03.553 回答
0

如果可以在编译时评估字符串,那么编译器将负责为您组合它们。如果您在运行时构建长字符串,请使用StringBuilder.

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

来源

String foo = "asdf" + "fdsa";

类文件

Constant pool:
 #1 = Methodref          #6.#17         //  java/lang/Object."<init>":()V
 #2 = String             #18            //  asdffdsa
...
#18 = Utf8               asdffdsa
于 2013-09-27T11:20:17.633 回答
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";
于 2013-09-27T11:20:34.310 回答