[[这里有一些很好的答案,但我发现他们仍然缺少一些信息。]]
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";
但是,即使您要追加任何字段或其他非常量,编译器也将使用内部 字段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();
我使用a的另一时间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);
最后,正如@TJrowder指出的那样,您应该始终对的大小进行猜测StringBuilder
。char[]
当增加内部缓冲区的大小时,这将节省创建的对象数量。
PreparedStatement
或类似的方式:docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html