[[这里有一些很好的答案,但我发现他们仍然缺乏一些信息。 ]]
return (new StringBuilder("select id1, " + " id2 " + " from " + " table"))
.toString();
因此,正如您所指出的,您给出的示例过于简单,但无论如何让我们对其进行分析。这里发生的是 编译器 实际上在这里 + 工作,因为 "select id1, " + " id2 " + " from " + " table" 都是常量。所以这就变成了:
return new StringBuilder("select id1, id2 from table").toString();
在这种情况下,显然使用StringBuilder 是没有意义的。你不妨这样做:
// the compiler combines these constant strings
return "select id1, " + " id2 " + " from " + " table";
但是,即使您附加任何字段或其他非常量,编译器也会使用 internal StringBuilder -- 您无需定义:
// an internal StringBuilder is used here
return "select id1, " + fieldName + " from " + tableName;
在幕后,这变成了大约相当于:
StringBuilder sb = new StringBuilder("select id1, ");
sb.append(fieldName).append(" from ").append(tableName);
return sb.toString();
真正唯一需要直接使用StringBuilder的时候是当你有条件代码的时候。例如,如下所示的代码迫切需要StringBuilder:
// 1 StringBuilder used in this line
String query = "select id1, " + fieldName + " from " + tableName;
if (where != null) {
// another StringBuilder used here
query += ' ' + where;
}
第一行中的+ 使用了一个StringBuilder 实例。然后+= 使用另一个StringBuilder 实例。这样做更有效率:
// choose a good starting size to lower chances of reallocation
StringBuilder sb = new StringBuilder(64);
sb.append("select id1, ").append(fieldName).append(" from ").append(tableName);
// conditional code
if (where != null) {
sb.append(' ').append(where);
}
return sb.toString();
我使用StringBuilder 的另一次是当我从多个方法调用构建字符串时。然后我可以创建带有StringBuilder 参数的方法:
private void addWhere(StringBuilder sb) {
if (where != null) {
sb.append(' ').append(where);
}
}
当您使用StringBuilder 时,应同时注意+ 的任何用法:
sb.append("select " + fieldName);
+ 将导致创建另一个内部StringBuilder。这当然应该是:
sb.append("select ").append(fieldName);
最后,正如@T.J.rowder 指出的那样,您应该始终猜测StringBuilder 的大小。这将节省在增加内部缓冲区大小时创建的 char[] 对象的数量。