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

Является ли конкатенация строк в scala столь же дорогостоящей, как и на Java?

В Java рекомендуется использовать конкатенацию строк с помощью StringBuilder из-за плохой производительности добавляемых строк с помощью оператора+. Рекомендуется ли такая же практика для Scala или улучшен ли язык в отношении того, как java выполняет конкатенацию строки?

4b9b3361

Ответ 1

Scala использует строки Java (java.lang.String), поэтому его конкатенация строк такая же, как у Java: то же самое происходит и в обоих. (В то же время среда выполнения.) В Scala существует специальный класс StringBuilder, который "предоставляет API, совместимый с java.lang.StringBuilder"; см. http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html.

Но с точки зрения "лучших практик", я думаю, что большинство людей обычно считают, что лучше писать простой, понятный код, чем максимально эффективный код, за исключением случаев, когда есть реальная проблема с производительностью или веская причина ожидать этого. Оператор + на самом деле не имеет "плохой производительности", он просто s += "foo" эквивалентен s = s + "foo" (т.е. Создает новый объект String), что означает, что если вы много делаете от конкатенаций к (как выглядит) "одна строка", вы можете избежать создания ненужных объектов — и многократно повторяя предыдущие части из одной строки в другую; используя StringBuilder вместо String. Обычно разница не важна. (Разумеется, "простой, понятный код" немного противоречив: использование += проще, использование StringBuilder более ясное. Но все же решение должно основываться скорее на соображениях написания кода, а не на незначительных соображениях производительности.)

Ответ 2

Конкатенация строк Scalas работает так же, как и Javas.

val x = 5
"a"+"b"+x+"c"

переводится на

new StringBuilder()).append("ab").append(BoxesRunTime.boxToInteger(x)).append("c").toString()

StringBuilder scala.collection.mutable.StringBuilder. Это причина, по которой значение, добавляемое к StringBuilder, помещается в компилятор.

Вы можете проверить поведение, декомпилировав байт-код с помощью javap.

Ответ 3

Scala использует java.lang.String как тип для строк, поэтому он подчиняется тем же характеристикам.

Ответ 4

Я хочу добавить: если у вас есть последовательность строк, то уже существует метод создания из них новой строки (все элементы, объединенные). Он называется mkString.

Пример: (http://ideone.com/QJhkAG)

val example = Seq("11111", "2222", "333", "444444")
val result = example.mkString
println(result) // prints "111112222333444444"