Является ли конкатенация строк в Scala такой же дорогой, как и в Java? - PullRequest
45 голосов
/ 22 декабря 2011

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

Ответы [ 4 ]

44 голосов
/ 22 декабря 2011

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), что означает, что, если вы делаете много конкатенации к (как выглядит) «одной строке», вы можете избежать создания ненужных объектов & mdash; и многократно переписывать более ранние части из одной строки в другую & mdash; используя StringBuilder вместо String. Обычно разница не важна. (Конечно, «простой, понятный код» немного противоречив: использование += проще, использование StringBuilder более понятно. Но, тем не менее, решение обычно должно основываться на соображениях написания кода, а не на незначительных соображениях производительности.)

21 голосов
/ 22 декабря 2011

Конкатенация строк 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.

5 голосов
/ 02 июня 2014

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

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

val example = Seq("11111", "2222", "333", "444444")
val result = example.mkString
println(result) // prints "111112222333444444"
2 голосов
/ 22 декабря 2011

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

...