最近我遇到了一个我以前没有见过的习语:使用StringWriter
和PrintWriter
进行字符串拼接。我的意思是,我知道如何使用它们,但我一直在使用StringBuilder
。是否有明确的理由来偏爱其中之一?StringBuilder
方法对我来说更自然,但这只是风格上的区别吗?
我查看了几个问题(包括这个问题:StringWriter或StringBuilder),但没有一个回答实际上涉及到是否有理由为简单的字符串拼接而偏好其中之一。
这是我已经看到并且使用了很多次的习惯用法:使用StringBuilder进行字符串拼接:
public static String newline = System.getProperty("line.separator");
public String viaStringBuilder () {
StringBuilder builder = new StringBuilder();
builder.append("first thing").append(newline); // NOTE: avoid doing builder.append("first thing" + newline);
builder.append("second thing").append(newline);
// ... several things
builder.append("last thing").append(newline);
return builder.toString();
}
这是一种新的惯用法:使用StringWriter和PrintWriter进行字符串拼接:
public String viaWriters() {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
printWriter.println("first thing");
printWriter.println("second thing");
// ... several things
printWriter.println("last thing");
printWriter.flush();
printWriter.close();
return stringWriter.toString();
}
编辑 看起来没有一个具体的理由可以优先选择其中一个,因此我接受了最符合我的理解的答案,并点赞了所有其他答案。此外,我还发布了自己的答案,介绍了我运行基准测试的结果,以回应其中一个答案。谢谢大家。
再次编辑 结果发现有一个具体的理由要优先选择一个(具体来说是StringBuilder)。我第一次错过的是添加换行符。当您添加换行符(如上所述,作为单独的附加内容)时,速度略快-不是非常快,但与意图的清晰度相结合,它绝对更好。请参见下面的答案以获得改进后的时间记录。
builder.append("first thing" + newline)
。问题在于它多了一个不必要的String分配(首先创建“first thing\n”,然后将字符串数据复制到builder)。相反,应该这样做:builder.append("first thing").append(newline)
。这直接将“first thing”复制到builder,然后是newline
。当然,只有当物品数量不固定(例如在循环中)时才应使用StringBuilder,javac已经将"a" + "b" + "c"
优化为new StringBuilder().append("a").append("b").append("c").toString()
。 - robinstThrowable.printStackTrace()
需要一个写入器。 - ceving