Is string concatenation in scala as costly as it is in Java?

前端 未结 4 669
陌清茗
陌清茗 2020-12-29 18:17

In Java, it\'s a common best practice to do string concatenation with StringBuilder due to the poor performance of appending strings using the + operator. Is the same practi

相关标签:
4条回答
  • 2020-12-29 18:40

    Scala uses java.lang.String as the type for strings, so it is subject to the same characteristics.

    0 讨论(0)
  • Scalas String concatenation works the same way as Javas does.

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

    is translated to

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

    StringBuilder is scala.collection.mutable.StringBuilder. That's the reason why the value appended to the StringBuilder is boxed by the compiler.

    You can check the behavior by decompile the bytecode with javap.

    0 讨论(0)
  • 2020-12-29 18:55

    I want to add: if you have a sequence of strings, then there is already a method to create a new string out of them (all items, concatenated). It's called mkString.

    Example: (http://ideone.com/QJhkAG)

    val example = Seq("11111", "2222", "333", "444444")
    val result = example.mkString
    println(result) // prints "111112222333444444"
    
    0 讨论(0)
  • 2020-12-29 19:05

    Scala uses Java strings (java.lang.String), so its string concatenation is the same as Java's: the same thing is taking place in both. (The runtime is the same, after all.) There is a special StringBuilder class in Scala, that "provides an API compatible with java.lang.StringBuilder"; see http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html.

    But in terms of "best practices", I think most people would generally consider it better to write simple, clear code than maximally efficient code, except when there's an actual performance problem or a good reason to expect one. The + operator doesn't really have "poor performance", it's just that s += "foo" is equivalent to s = s + "foo" (i.e. it creates a new String object), which means that, if you're doing a lot of concatenations to (what looks like) "a single string", you can avoid creating unnecessary objects — and repeatedly recopying earlier portions from one string to another — by using a StringBuilder instead of a String. Usually the difference is not important. (Of course, "simple, clear code" is slightly contradictory: using += is simpler, using StringBuilder is clearer. But still, the decision should usually be based on code-writing considerations rather than minor performance considerations.)

    0 讨论(0)
提交回复
热议问题