listas interpolacion scala string-concatenation

scala - listas - java interpolacion string



¿La concatenación de cadenas en Scala es tan costosa como en Java? (4)

La concatenación de Scalas String funciona de la misma manera que Javas.

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

se traduce a

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

StringBuilder es scala.collection.mutable.StringBuilder . Esa es la razón por la cual el valor adjunto a StringBuilder está encuadrado por el compilador.

Puede verificar el comportamiento descompilando el bytecode con javap.

En Java, es una mejor práctica común realizar la concatenación de cadenas con StringBuilder debido al bajo rendimiento de las cadenas añadidas con el operador +. ¿Se recomienda la misma práctica para Scala o se ha mejorado el lenguaje sobre cómo java realiza su concatenación de cadenas?


Quiero agregar: si tiene una secuencia de cadenas, entonces ya existe un método para crear una nueva cadena de ellas (todos los elementos, concatenados). Se llama mkString .

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

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


Scala usa java.lang.String como el tipo de cadenas, por lo que está sujeto a las mismas características.


Scala utiliza cadenas de Java ( java.lang.String ), por lo que su concatenación de cadenas es la misma que la de Java: lo mismo está ocurriendo en ambos. (El tiempo de ejecución es el mismo, después de todo.) Hay una clase especial StringBuilder en Scala, que "proporciona una API compatible con java.lang.StringBuilder "; ver http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html .

Pero en términos de "mejores prácticas", creo que la mayoría de la gente generalmente considera mejor escribir código simple y claro que el código de máxima eficacia, excepto cuando hay un problema real de rendimiento o una buena razón para esperarlo. El operador + realidad no tiene "bajo rendimiento", es solo que s += "foo" es equivalente a s = s + "foo" (es decir, crea un nuevo objeto String ), lo que significa que, si está haciendo un montón de concatenaciones para (lo que parece) "una sola cadena", puede evitar la creación de objetos innecesarios y volver a copiar varias veces partes anteriores de una cadena a otra mediante el uso de StringBuilder lugar de String . Por lo general, la diferencia no es importante. (Por supuesto, "código simple y claro" es ligeramente contradictorio: usar += es más simple, usar StringBuilder es más claro. Sin embargo, la decisión generalmente debería basarse en consideraciones de escritura de código en lugar de consideraciones de rendimiento menores).