2011-12-22 793 views

Respuesta

36

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 máximo eficiente, excepto cuando hay un problema real de rendimiento o una buena razón para esperar uno. El operador + realmente 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 muchas concatenaciones a (lo que parece) "una sola cadena", puede evitar crear objetos innecesarios — y volver a copiar varias partes anteriores de una cadena a otra — utilizando StringBuilder en lugar de String. Por lo general, la diferencia no es importante. (Por supuesto, "simple código, claro" es un poco contradictoria: el uso de += es más simple, utilizando StringBuilder es más clara, pero aún así, la decisión por lo general debe basarse en consideraciones de código de escritura en lugar de consideraciones de rendimiento menores..)

+1

En mi caso estoy muy preocupado por el rendimiento por lo tanto, por qué estoy haciendo la pregunta. ¡Gracias por toda la información! – bionicseraph

+0

AFAIK, la JVM trata automáticamente las concatenaciones '+' repetidas en una expresión de la misma manera que lo haría con un buffer de cadena. Entonces, no hay diferencia de rendimiento realmente. – aishwarya

+0

@aishwarya: el JLS recomienda que los compiladores optimicen 'foo + bar + baz + bip' al equivalente de' nuevo StringBuilder (foo) .append (barra) .append (baz) .append (bip) .toString() 'y '" foo "+" bar "+" baz "+" bip "' to '" foobarbazbip "', pero esos son casos bastante angostos. Y no creo que las JVM (a diferencia de los compiladores) generalmente hagan algún tipo de optimización en ese sentido, aunque podría estar equivocado. – ruakh

2

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

19

Concatenación de cadenas Scalas funciona de la misma manera que lo hace 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 comprobar el comportamiento descompilando el bytecode con javap.

2

I desea 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" 
Cuestiones relacionadas