[[Có một số câu trả lời hay ở đây nhưng tôi thấy rằng họ vẫn còn thiếu một chút thông tin. ]]
return (new StringBuilder("select id1, " + " id2 " + " from " + " table"))
.toString();
Vì vậy, như bạn đã chỉ ra, ví dụ bạn đưa ra là đơn giản nhưng chúng ta hãy phân tích nó. Điều xảy ra ở đây là trình biên dịch thực sự thực hiện +
công việc ở đây vì "select id1, " + " id2 " + " from " + " table"
tất cả đều là hằng số. Vì vậy, điều này biến thành:
return new StringBuilder("select id1, id2 from table").toString();
Trong trường hợp này, rõ ràng, không có ích lợi gì khi sử dụng StringBuilder
. Bạn cũng có thể làm:
// the compiler combines these constant strings
return "select id1, " + " id2 " + " from " + " table";
Tuy nhiên, ngay cả khi bạn đang thêm bất kỳ trường nào hoặc các hằng số khác thì trình biên dịch sẽ sử dụng nội bộ StringBuilder
- bạn không cần phải xác định một:
// an internal StringBuilder is used here
return "select id1, " + fieldName + " from " + tableName;
Dưới các trang bìa, mã này biến thành mã gần tương đương với:
StringBuilder sb = new StringBuilder("select id1, ");
sb.append(fieldName).append(" from ").append(tableName);
return sb.toString();
Thực sự lần duy nhất bạn cần sử dụng StringBuilder
trực tiếp là khi bạn có mã điều kiện. Ví dụ: mã trông giống như sau đây là tuyệt vọng cho StringBuilder
:
// 1 StringBuilder used in this line
String query = "select id1, " + fieldName + " from " + tableName;
if (where != null) {
// another StringBuilder used here
query += ' ' + where;
}
Trong +
dòng đầu tiên sử dụng một StringBuilder
trường hợp. Sau đó, +=
sử dụng một StringBuilder
trường hợp khác . Sẽ hiệu quả hơn khi làm:
// 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();
Một lần khác mà tôi sử dụng a StringBuilder
là khi tôi đang xây dựng một chuỗi từ một số lệnh gọi phương thức. Sau đó, tôi có thể tạo các phương thức có StringBuilder
đối số:
private void addWhere(StringBuilder sb) {
if (where != null) {
sb.append(' ').append(where);
}
}
Khi bạn đang sử dụng một StringBuilder
, bạn nên xem bất kỳ cách sử dụng nào của +
cùng một lúc:
sb.append("select " + fieldName);
Điều đó +
sẽ gây ra một nội bộ khác StringBuilder
được tạo ra. Điều này tất nhiên phải là:
sb.append("select ").append(fieldName);
Cuối cùng, như @TJrowder đã chỉ ra, bạn nên luôn đoán kích thước của StringBuilder
. Điều này sẽ tiết kiệm số lượng char[]
đối tượng được tạo khi tăng kích thước của bộ đệm bên trong.
PreparedStatement
hoặc một cái gì đó tương tự: docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html