La concaténation de chaîne en StringBuilder java
J'ai un héritage fichier Java qui utilise la concaténation de Chaîne à construire d'immenses objets String.Ses un grave problème de performance.Est-il une méthode en tant que telle qui ne le suit
String test="I am a very bad programmer"
+"to use concatenation"
+"Instead of StringBuilder"
+" or StringBuffer";
à
StringBuilder strBuilder= new StringBuilder();
strBuilder.append("I am a bad programmer");
strBuilder.append("to use concatenation");
strBuilder.append("Instead of StringBuilder");
strBuilder.append(" or StringBuffer");
String str= strBuilder.toString();
essentiellement, j'ai besoin d'un stub en java pour donner de la Chaîne d'instanciation comme entrée et de convertir en StringBuilder.Quelqu'un essayait de le faire dans le passé?
Autant que je sache StringBuilder et StringBuffer ne donne qu'une augmentation des performances lors de l'utilisation dans une boucle, depuis la compilter convertit automatiquement normale concaténation de StringBuilder(?).
Êtes-vous sûr que vous n'avez pas de goulot d'étranglement des performances quelque part d'autre?
vous devriez ai prévu cela comme une réponse, pas un commentaire.
Merci pour votre suggestion va continuer à utiliser StringBuilder comme et quand nécessaire.
la question liée est différent, parce qu'il n'utilise pas statique chaînes. Il utilise un appel de fonction dans la concaténation. Mon énoncé est vrai pour l'exemple donné dans ce question. Y compris les appels de la fonction de modification de l'image.
Êtes-vous sûr que vous n'avez pas de goulot d'étranglement des performances quelque part d'autre?
vous devriez ai prévu cela comme une réponse, pas un commentaire.
Merci pour votre suggestion va continuer à utiliser StringBuilder comme et quand nécessaire.
la question liée est différent, parce qu'il n'utilise pas statique chaînes. Il utilise un appel de fonction dans la concaténation. Mon énoncé est vrai pour l'exemple donné dans ce question. Y compris les appels de la fonction de modification de l'image.
OriginalL'auteur Harish | 2011-03-25
Vous devez vous connecter pour publier un commentaire.
Fixe littéral comme dans votre exemple est plus efficace que l'utilisation d'un StringBuilder.
Fixe littérale sera détectée par le compilateur et sera incorporé comme une valeur unique, de sorte que les deux lignes
et
va générer exactement le même bytecode.
La situation est différente si la concaténation n'est pas fait avec des littéraux, mais avec les appels de fonction.
Lorsque vous avez besoin d'ajouter des cordes de façon dynamique, préférez StringBuilder plus de StringBuffer car il est un peu plus rapide mais il n'est pas synchronisé.
Voici l'exemple de pseudo-code binaire:
le bytecode généré pour ces classes est:
Comme vous pouvez le voir, les deux variables sont traitées de la même façon.
Je ne pense pas que cela appartient à la spécification du langage, que ce n'est "juste" une optimisation du compilateur.
Un autre compilateur (j'ai été en utilisant le Soleil compilateur) peut-être quelque chose de complètement différent - qui est OK aussi longtemps que le comportement ne change pas.
il suffit de créer deux classes de test et de les compiler à l'aide de
javap -c
n'ont pas le temps maintenant 🙂 btw, javac ou eclipse?
J'ai ajouté un exemple d'utilisation de javac (je n'utilise pas Eclipse)
OriginalL'auteur a_horse_with_no_name
Non, il n'est pas un problème de performance. Si vous êtes à la concaténation de la chaîne inline (comme montré) plutôt que d'utiliser une boucle par exemple, alors le compilateur transforme automatiquement le
+
à l'aide d'unStringBuilder
. Consultez la documentation dejava.lang.String
- En fait, le compilateur peut utiliser le fait que ce sont tous des constantes de chaîne et de se joindre à eux même avant l'exécution (JLS références)
OriginalL'auteur Bozho
En fait le compilateur s'applique déjà que l'optimisation pour vous dans les dernières versions de Java (au moins à partir de la version 1.5, je pense).
Ce qui se passe quand un Compilateur Java voit beaucoup de concaténations de Chaîne dans une ligne?
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18.1.2
OriginalL'auteur Al-Khwarizmi
Juste de chaîne constante contatenation est optimisé au moment de la compilation, et est trivial. Le problème est quand vous faites quelque chose de moins banal:
Chaîne exemple1 = "Préfixe" + variableString1 + "Suffixe";
le pire des cas, des boucles avec ajout de où chaque itération doit créer une nouvelle chaîne. Car ce qui est commun pour les buffered lit de fichiers vous pouvez obtenir de très grandes chaînes de recréer, un problème que j'ai eu récemment.
Alors que je ne vois pourquoi vous voulez faire ce que vous faites, les structures du code sont trop différentes pour il suffit de déposer et remplacer, et un script pour modifier le code devra être assez avancé pour être en mesure de traiter toutes les références. Peut-être il y a un moyen avec annonomous les classes internes mais qui peut vous permettre de garder la même chaîne de référence d'envelopper la construction dans la chaîne des constructeurs. Ce n'est probablement pas différent de ce que l'optimiseur déjà fait
OriginalL'auteur K.Barad