En Java, il est courant de concaténer des chaînes de caractères avec StringBuilder en raison des mauvaises performances de l'ajout de chaînes de caractères à l'aide de l'opérateur +. La même pratique est-elle recommandée pour Scala ou le langage a-t-il amélioré la façon dont Java effectue sa concaténation de chaînes ?
Réponses
Trop de publicités?Scala utilise les chaînes de caractères de Java ( java.lang.String
), donc sa concaténation de chaînes de caractères est la même que celle de Java : la même chose se passe dans les deux cas. (Le temps d'exécution est le même, après tout.) Il existe une fonction spéciale StringBuilder
en Scala, qui "fournit une API compatible avec la classe java.lang.StringBuilder
" ; voir http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html .
Mais en termes de "meilleures pratiques", je pense que la plupart des gens considèrent généralement qu'il est préférable d'écrire un code simple et clair plutôt qu'un code à l'efficacité maximale, sauf en cas de problème de performance réel ou de bonne raison d'en attendre un. Le site +
L'opérateur n'a pas vraiment de "mauvaises performances", c'est juste que s += "foo"
est équivalent à s = s + "foo"
(c'est-à-dire qu'il crée un nouveau String
), ce qui signifie que, si vous effectuez de nombreuses concaténations vers (ce qui ressemble à) "une seule chaîne de caractères", vous pouvez éviter de créer des objets inutiles - et de recopier de manière répétée les portions précédentes d'une chaîne de caractères vers une autre - en utilisant un objet StringBuilder
au lieu d'un String
. En général, la différence n'est pas importante. (Bien sûr, "un code simple et clair" est légèrement contradictoire : l'utilisation de +=
est plus simple, en utilisant StringBuilder
est plus clair. Mais tout de même, la décision devrait généralement être basée sur des considérations d'écriture de code plutôt que sur des considérations mineures de performance).
La concaténation de chaînes de caractères Scalas fonctionne de la même manière que Javas.
val x = 5
"a"+"b"+x+"c"
est traduit en
new StringBuilder()).append("ab").append(BoxesRunTime.boxToInteger(x)).append("c").toString()
StringBuilder est scala.collection.mutable.StringBuilder . C'est la raison pour laquelle la valeur ajoutée au StringBuilder est encadrée par le compilateur.
Vous pouvez vérifier le comportement en décompilant le bytecode avec javap.
J'aimerais ajouter que si vous avez une séquence de chaînes de caractères, il existe déjà une méthode pour créer une nouvelle chaîne de caractères à partir de celles-ci (tous les éléments, concaténés). Elle s'appelle mkString
.
Exemple : ( http://ideone.com/QJhkAG )
val example = Seq("11111", "2222", "333", "444444")
val result = example.mkString
println(result) // prints "111112222333444444"