【发布时间】:2009-05-18 16:28:47
【问题描述】:
来自 Perl,我肯定错过了在源代码中创建多行字符串的“here-document”方法:
$string = <<"EOF" # create a three-line string
text
text
text
EOF
在 Java 中,当我从头开始连接多行字符串时,我必须在每一行加上繁琐的引号和加号。
有哪些更好的选择?在属性文件中定义我的字符串?
编辑:两个答案说 StringBuilder.append() 比加号更可取。谁能详细说明他们为什么这么认为?它看起来一点也不适合我。我正在寻找解决多行字符串不是一流语言结构这一事实的方法,这意味着我绝对不想用方法调用替换一流的语言结构(字符串与加号连接)。
编辑:为了进一步澄清我的问题,我根本不关心性能。我担心可维护性和设计问题。
【问题讨论】:
-
StringBuilder.append() 在重复添加到字符串时比 plus 更可取,因为每次您执行
string1 + string2时,您都在分配一个新的字符串对象并从两个输入字符串中复制字符。如果您将 n 个字符串加在一起,您将进行 n-1 次分配和大约 (n^2)/2 个字符副本。另一方面,StringBuilder 复制和重新分配的频率较低(尽管当您超过其内部缓冲区的大小时,它仍然会同时执行这两种操作)。理论上,有些情况下编译器可以将 + 转换为使用 StringBuilder,但实际上谁知道呢。 -
每次我跳入调试器时,+ 都会在 Java 1.5 上转换为 StringBuilder.append() 调用。我有同事困惑地告诉我 StringBuilder 有一个错误,因为他们调试到似乎没有调用它的代码并在那里结束。
-
请注意,由 "abc\n" + "def\n" 等组成的字符串文字不使用 StringBuilder:编译器将它们粘合在一起并将它们作为单个放入 .class 文件中字面量,与其他类型的常量折叠相同。
-
大多数 IDE 支持输入多行字符串。 IE。您只需将所需内容键入或粘贴到“”字符串中,它就会根据需要添加 \n 和“+”。例如我可以将 40 行文本粘贴到字符串中,然后 IDE 会为您整理出来。