Лучше, чем объединение строк?
Если вы спрашиваете,
stringBufferVariable.append("something")
.append("more");
...
будет работать лучше, чем конкатенация с +
, тогда да, обычно. Вот и вся причина, по которой эти классы существуют. Создание объекта обходится дороже по сравнению с обновлением значений в массиве char
.
Похоже, что большинство, если не все компиляторы, теперь преобразуют конкатенацию строк в использование StringBuilder в простых случаях, таких как str = "something" + "more" + "...";
. Единственное различие в производительности, которое я вижу, состоит в том, что компилятор не будет иметь преимущества при установке начального размера. Контрольные показатели скажут вам, достаточно ли разницы, чтобы иметь значение. Использование +
сделает код более читабельным.
Из того, что я прочитал, компилятор, очевидно, не может оптимизировать конкатенацию, выполняемую в цикле, когда это что-то вроде
String str = "";
for (int i = 0; i < 10000; i++) {
str = str + i + ",";
}
так что в этих случаях вы все равно захотите явно использовать StringBuilder.
StringBuilder против StringBuffer
StringBuilder
не является поточно-ориентированным, в то время как StringBuffer
, но в остальном они одинаковы. Синхронизация, выполняемая в StringBuffer, делает его медленнее, поэтому StringBuilder
быстрее и должен использоваться, если вам не нужна синхронизация.
Если вы используете setLength
?
То, как в настоящее время пишется ваш пример, я не думаю, что вызов setLength
что-то вам даст, так как вы создаете новый StringBuffer при каждом проходе цикла. Что вы действительно должны сделать, это
StringBuilder sb = new StringBuilder(128);
while (<some condition>) {
sb.append(<something>)
.append(<more>)
... ;
// Append stringBufferVariable.toString() to a file;
sb.setLength(0);
}
Это позволяет избежать ненужного создания объекта, и setLength будет обновлять только внутреннюю переменную int
в этом случае.