[[Hier gibt es einige gute Antworten, aber ich finde, dass ihnen noch ein paar Informationen fehlen. ]]
return (new StringBuilder("select id1, " + " id2 " + " from " + " table"))
.toString();
Wie Sie hervorheben, ist das Beispiel, das Sie geben, vereinfachend, aber lassen Sie es uns trotzdem analysieren. Was hier passiert, ist, dass der Compiler die +
Arbeit hier tatsächlich erledigt , weil "select id1, " + " id2 " + " from " + " table"
alle Konstanten sind. Das wird also zu:
return new StringBuilder("select id1, id2 from table").toString();
In diesem Fall macht es offensichtlich keinen Sinn, sie zu verwenden StringBuilder
. Sie könnten genauso gut tun:
// the compiler combines these constant strings
return "select id1, " + " id2 " + " from " + " table";
Selbst wenn Sie Felder oder andere Nichtkonstanten anhängen würden, würde der Compiler ein internes verwenden StringBuilder
- Sie müssen keines definieren:
// an internal StringBuilder is used here
return "select id1, " + fieldName + " from " + tableName;
Unter der Decke wird daraus Code, der ungefähr gleichbedeutend ist mit:
StringBuilder sb = new StringBuilder("select id1, ");
sb.append(fieldName).append(" from ").append(tableName);
return sb.toString();
Wirklich das einzige Mal, dass Sie StringBuilder
direkt verwenden müssen, ist, wenn Sie bedingten Code haben. Zum Beispiel ist Code, der wie folgt aussieht, verzweifelt nach StringBuilder
:
// 1 StringBuilder used in this line
String query = "select id1, " + fieldName + " from " + tableName;
if (where != null) {
// another StringBuilder used here
query += ' ' + where;
}
Das +
in der ersten Zeile verwendet eine StringBuilder
Instanz. Dann verwendet der +=
eine andere StringBuilder
Instanz. Es ist effizienter zu tun:
// 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();
Ein anderes Mal, StringBuilder
wenn ich a verwende, erstelle ich eine Zeichenfolge aus einer Reihe von Methodenaufrufen. Dann kann ich Methoden erstellen, die ein StringBuilder
Argument annehmen :
private void addWhere(StringBuilder sb) {
if (where != null) {
sb.append(' ').append(where);
}
}
Wenn Sie a verwenden StringBuilder
, sollten Sie +
gleichzeitig auf die Verwendung von achten:
sb.append("select " + fieldName);
Dadurch +
wird ein weiteres internes StringBuilder
erstellt. Dies sollte natürlich sein:
sb.append("select ").append(fieldName);
Schließlich sollten Sie, wie @TJrowder hervorhebt, immer die Größe des erraten StringBuilder
. Dies spart die Anzahl der char[]
Objekte, die beim Vergrößern des internen Puffers erstellt werden.
PreparedStatement
oder etwas Ähnliches: docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html