在scala中的string连接和Java一样昂贵吗?
在Java中,由于使用+运算符附加string的性能差,因此使用StringBuilder进行string连接是一种常见的最佳做法。 是否为Scala推荐相同的做法,或者改进了Java如何执行string连接的语言?
Scala使用Javastring( java.lang.String
),所以它的string连接和Java一样:两者都发生同样的事情。 (毕竟,运行时是一样的。)在Scala中有一个特殊的StringBuilder
类,它提供了一个与java.lang.StringBuilder
兼容的API; 请参阅http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html 。
但就“最佳实践”而言,我认为大多数人通常会认为写出比最高效的代码简单明了的代码更好,除非出现实际的性能问题或有理由期待。 +
运算符并没有真正的“糟糕的performance”,只是s += "foo"
等价于s = s + "foo"
(即它创build了一个新的String
对象),这意味着如果你(看上去像是)“单个string”,可以避免创build不必要的对象 – 并且通过使用StringBuilder
而不是String
重复复制从一个string到另一个string的较早部分。 通常差异并不重要。 (当然,“简单明了的代码”有点矛盾:使用+=
比较简单,使用StringBuilder
更清晰,但是通常应该基于代码考虑而不是次要的性能考虑。
Scalasstring连接的工作方式与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反编译字节码来检查行为。
Scala使用java.lang.String
作为string的types,所以它受到相同的特征。
我想补充:如果你有一个string序列,那么已经有一个方法来创build一个新的string(所有项目,连接)。 这就是所谓的mkString
。
例如:( http://ideone.com/QJhkAG )
val example = Seq("11111", "2222", "333", "444444") val result = example.mkString println(result) // prints "111112222333444444"