[[Ci sono alcune buone risposte qui, ma trovo che manchino ancora un po 'di informazioni. ]]
return (new StringBuilder("select id1, " + " id2 " + " from " + " table"))
.toString();
Quindi, come fai notare, l'esempio che fornisci è semplicistico ma analizziamolo comunque. Quello che succede qui è che il compilatore fa effettivamente il +
lavoro qui perché "select id1, " + " id2 " + " from " + " table"
sono tutte costanti. Quindi questo si trasforma in:
return new StringBuilder("select id1, id2 from table").toString();
In questo caso, ovviamente, non ha senso usare StringBuilder
. Potresti anche fare:
// the compiler combines these constant strings
return "select id1, " + " id2 " + " from " + " table";
Tuttavia, anche se si aggiungessero campi o altre non costanti, il compilatore utilizzerebbe un interno StringBuilder
: non è necessario definirne uno:
// an internal StringBuilder is used here
return "select id1, " + fieldName + " from " + tableName;
Sotto le coperte, questo si trasforma in codice che è approssimativamente equivalente a:
StringBuilder sb = new StringBuilder("select id1, ");
sb.append(fieldName).append(" from ").append(tableName);
return sb.toString();
In realtà l'unica volta che devi usare StringBuilder
direttamente è quando hai codice condizionale. Ad esempio, un codice simile al seguente è alla disperata ricerca di un StringBuilder
:
// 1 StringBuilder used in this line
String query = "select id1, " + fieldName + " from " + tableName;
if (where != null) {
// another StringBuilder used here
query += ' ' + where;
}
La +
nella prima riga utilizza un StringBuilder
esempio. Quindi +=
utilizza un'altra StringBuilder
istanza. È più efficiente fare:
// 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();
Un'altra volta che uso a StringBuilder
è quando creo una stringa da un numero di chiamate di metodo. Quindi posso creare metodi che accettano un StringBuilder
argomento:
private void addWhere(StringBuilder sb) {
if (where != null) {
sb.append(' ').append(where);
}
}
Quando stai usando a StringBuilder
, dovresti guardare per qualsiasi utilizzo +
allo stesso tempo:
sb.append("select " + fieldName);
Ciò +
causerà la StringBuilder
creazione di un altro interno . Questo dovrebbe ovviamente essere:
sb.append("select ").append(fieldName);
Infine, come sottolinea @TJrowder, dovresti sempre fare un'ipotesi sulla dimensione del file StringBuilder
. Ciò consentirà di risparmiare sul numero di char[]
oggetti creati aumentando la dimensione del buffer interno.
PreparedStatement
o qualcosa di simile: docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html