Подтвердить что ты не робот

Когда вы должны явно использовать StringBuilder?

Как я понимаю, когда я делаю String baz = "foo" + "bar" + "123", компилятор Java внутренне заменяет выражение StringBuilder. Однако наш преподаватель Java сказал нам, что это хорошая практика всегда использовать StringBuilder явно...

Правильно ли я предполагаю, что я только должен явно использовать StringBuilder при конкатенации внутренних циклов, как указано в ответе на вопрос о переполнении стека. Строковый конструктор vs string конкатенация? Существуют ли другие случаи, когда вы должны явно использовать StringBuilder вместо + или +=?

4b9b3361

Ответ 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;
}