Когда вы должны явно использовать StringBuilder?
Как я понимаю, когда я делаю String baz = "foo" + "bar" + "123"
, компилятор Java внутренне заменяет выражение StringBuilder
. Однако наш преподаватель Java сказал нам, что это хорошая практика всегда использовать StringBuilder
явно...
Правильно ли я предполагаю, что я только должен явно использовать StringBuilder при конкатенации внутренних циклов, как указано в ответе на вопрос о переполнении стека. Строковый конструктор vs string конкатенация? Существуют ли другие случаи, когда вы должны явно использовать StringBuilder
вместо +
или +=
?
Ответы
Ответ 1
Это более общий, чем "внутренние циклы" - это когда вы хотите сделать конкатенацию над несколькими операторами и не нуждаетесь в промежуточном результате в виде строки. Например:
StringBuilder builder = new StringBuilder("Start");
if (someCondition) {
builder.append("Foo");
}
if (someOtherCondition) {
builder.append("Bar");
}
builder.append("End");
String result = builder.toString();
Пока вы можете написать это как:
String result = "Start" + (someCondition ? "Foo" : "")
+ (someOtherCondition ? "Bar" : "") + "End";
... это становится трудно читаемым. И если в телах if
есть больше выражений, это может оказаться даже невозможным.
Чтобы исправить что-то в вашем вопросе:
Как я понимаю, когда я делаю String baz = "foo" + "bar" + "123", компилятор java внутренне заменяет это выражение на StringBuilder.
Нет, когда вы пишете это выражение, компилятор распознает, что он является константой времени компиляции, и заменяет его на
String baz = "foobar123";
Это очень хорошая причина не использовать явно StringBuilder
- код выше явно более эффективен во время выполнения, чем
String baz = new StringBuilder("foo").append("bar").append("123").toString();
Когда он не является константой времени компиляции, компилятор Java выполняет конкатенацию с помощью StringBuilder
, обычно оставляя вам более понятный код, чем при явном использовании StringBuilder
, но без производительность хит. Я подозреваю, что ваш учитель либо неправильно понимает конкатенацию строк, либо просто читает где-то еще, что вы должны использовать StringBuilder
без полного понимания, когда это подходит.
Ответ 2
Оби Ван сказал, что только ситы думают в абсолютах или что-то подобное...
Хорошо, вы знаете, что компилятор Java внутренне заменяет "+" на Strings с использованием StringBuilder
. Вот что такое компиляторы для: облегчения жизни.
Если вы не используете, у вас есть петли, как в связанном случае или условные выражения из примера Джона Скита, это в первую очередь вопрос читаемости и удобства обслуживания.
Замена
return "User " + userName + " said";
с
new StringBuilder().append("User ").append(userName).append(" said").toString();
делает код более длинным, вероятно, более трудным для изменения, более вероятно, приведет к разрыву строк и даст вам большую производительность.
Однако, когда добавление применяется не только к строкам, но есть числа, возможно, решение с StringBuilder
иногда может быть более читаемым.
return "User" + a + b + " said: " + (c + d);
может быть более запутанным, поскольку:
return new StringBuilder().append("User ").append(a).append(b)
.append(" said: ").append(c+d).toString();
Но это прежде всего вопрос стиля мнений и кодирования. "Если" здесь не очень хорошее слово.
Ответ 3
Они также хороши для реализации таких вещей, как ключевое слово С# 'out' с помощью String. Пример
public int getInt(StringBuilder error)
{
int retVal = 0;
if (someErrorOccured)
error.append("Couldn't get int because of...");
else
retVal = whatItsSupposedToBe;
return retVal;
}