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

bio*_*aph 46 scala string-concatenation

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

rua*_*akh 44

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

但就"最佳实践"而言,我认为大多数人一般认为编写简单明了的代码比最有效的代码更好,除非出现实际的性能问题或者有理由期待它.该+运营商并没有真正有"表现不佳",它只是s += "foo"相当于s = s + "foo"(即,它会创建一个新的String对象),这意味着,如果你做了很多级联来(什么样子)"一个字符串",你可以避免创建不必要的对象 - 并通过使用StringBuilder而不是a 来反复地将早期部分从一个字符串重新复制到另一个字符串String.通常差异并不重要.(当然,"简单明了的代码"略有矛盾:使用+=更简单,使用StringBuilder更清晰.但是,决策通常应该基于代码编写考虑而不是轻微的性能考虑.)

  • pet peeve:在循环中使用+会导致O(n ^ 2)复杂度,而在O(n)中使用StringBuilder.额外的物体是一个小问题; 复杂性的爆炸性是一个主要因素. (11认同)

kir*_*uku 21

Scalas字符串连接的工作方式与Javas的工作方式相同.

val x = 5
"a"+"b"+x+"c"
Run Code Online (Sandbox Code Playgroud)

被翻译成

new StringBuilder()).append("ab").append(BoxesRunTime.boxToInteger(x)).append("c").toString()
Run Code Online (Sandbox Code Playgroud)

StringBuilder是scala.collection.mutable.StringBuilder.这就是为什么附加到StringBuilder的值被编译器装箱的原因.

您可以通过使用javap反编译字节码来检查行为.


Sar*_*sch 6

我想补充一点:如果你有一系列字符串,那么就已经有了一种方法来创建一个新的字符串(所有项目,连接).它被称为mkString.

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

val example = Seq("11111", "2222", "333", "444444")
val result = example.mkString
println(result) // prints "111112222333444444"
Run Code Online (Sandbox Code Playgroud)