30 votes

Ce qui se passe quand un Compilateur Java voit beaucoup de concaténations de Chaîne dans une ligne?

Supposons que j'ai une expression en Java, tels que:

String s = "abc" + methodReturningAString() + "ghi" + 
                anotherMethodReturningAString() + "omn" + "blablabla";

Quel est le comportement de la Java JDK par défaut du compilateur? C'est juste qu'il fait le cinq enchaînements ou il y a une puce de performance truc fait?

40voto

Kip Points 37013

Il génère l'équivalent de:

String s = new StringBuilder("abc")
           .append(methodReturningAString())
           .append("ghi")
           .append(anotherMethodReturningAString())
           .append("omn")
           .append("blablabla")
           .toString();

Il est assez intelligent pour pré-concaténer des chaînes statiques (c'est à dire l' "omn" + "blablabla"). On pourrait appeler l'utilisation de l' StringBuilder performances "truc" si vous le souhaitez. Il est certainement mieux pour les performances que les cinq précédents, ce qui donne quatre temporaires inutiles cordes. Aussi, l'utilisation de StringBuilder a été une amélioration des performances dans (je pense) de Java 5; avant cela, StringBuffer a été utilisé.

Edit: comme l'a souligné dans les commentaires, chaînes statiques ne sont que pré-concaténés si ils sont au début de la concaténation. Faire autrement serait briser l'ordre des opérations (même si dans ce cas je pense que le Soleil pourrait le justifier). Donc, étant donné ce:

String s = "abc" + "def" + foo() + "uvw" + "xyz";

il serait compilé comme ceci:

String s = new StringBuilder("abcdef")
           .append(foo())
           .append("uvw")
           .append("xyz")
           .toString();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X