scala中的字符串连接是否与Java中的字符串连接一样昂贵?

时间:2011-12-22 19:12:22

标签: scala string-concatenation

在Java中,由于使用+运算符追加字符串的性能较差,因此使用StringBuilder执行字符串连接是一种常见的最佳做法。是否为Scala推荐的做法是相同的,或者是否改进了java如何执行字符串连接的语言?

4 个答案:

答案 0 :(得分:43)

Scala使用Java字符串(java.lang.String),因此它的字符串连接与Java相同:两者都发生了同样的事情。 (毕竟运行时是相同的。)Scala中有一个特殊的StringBuilder类,它“提供与java.lang.StringBuilder兼容的API”;见http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html

但就“最佳实践”而言,我认为大多数人一般认为编写简单明了的代码比最有效的代码更好,除非出现实际的性能问题或者有理由期待它。 +运算符实际上没有“性能不佳”,只是s += "foo"等同于s = s + "foo"(即它创建了一个新的String对象),这意味着,如果你正在进行大量的连接(看起来像什么)“单个字符串”,你可以避免创建不必要的对象 - 并反复将早期部分从一个字符串重新复制到另一个字符串 - 使用StringBuilder代替一个String。通常差异并不重要。 (当然,“简单,清晰的代码”有点矛盾:使用+=更简单,使用StringBuilder更清楚。但是,仍然,决定通常应该基于代码编写考虑而不是较小的性能的考虑。)

答案 1 :(得分:21)

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反编译字节码来检查行为。

答案 2 :(得分:5)

我想补充一下:如果你有一系列字符串,那么已经有一种方法可以从中创建一个新字符串(所有项目,连接在一起)。它被称为mkString

示例:(http://ideone.com/QJhkAG

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

答案 3 :(得分:2)

Scala使用java.lang.String作为字符串的类型,因此它具有相同的特征。