2011-07-13 1 views
6

Puisque les chaînes de Java sont immuables, j'ai toujours utilisé StringBuilder ou StringBuffer pour concaténer des chaînes. Est-ce que la méthode String.format() gère ce problème aussi bien que StringBuilder ou StringBuffer? En d'autres termes, String.format() gère-t-il la mémoire aussi bien que StringBuffer ou StringBuilder?En Java, l'immuabilité des chaînes est-elle prise en compte dans l'implémentation de String.format()?

+9

(1) Ceci est spécifique à l'implémentation. (2) Il fonctionne assez bien jusqu'à ce que vous ayez des données qui montrent qu'il ne fonctionne pas assez bien, quelle que soit la façon dont il est implémenté. (3) Comme indiqué en 2, et comme * toujours * avec de telles questions, la seule façon de s'assurer est de profiler. – delnan

Répondre

4

Basé sur le code source de JDK Oracle, il semble que la mise en œuvre crée une nouvelle Formatter pour chaque appel String#format qui à son tour alloue un StringBuilder frais pour chaque appel. Donc oui. Mais comme mentionné dans le commentaire de votre question, il s'agit d'une implémentation spécifique bien que le bon sens implique qu'elle choisirait la manière la plus efficace de faire les choses.

+0

Intéressant, merci! Donc, comme StringBuilder n'est pas thread-safe, je suppose que String.format() n'est pas thread-safe ... au moins l'implémentation d'Oracle? – fooMonster

+1

Si chaque appel au format crée un nouveau StringBuilder et le garde local à la méthode, l'appel au format peut toujours être thread-safe. –

+0

@Michael "Peut encore être thread sûr"? Il semble que vous sous-entendez que le développeur peut le rendre compatible avec les threads en appelant String.format() de manière thread-safe. Clairement. Peut-être que je ne suis pas clair. Le suivi, ainsi que la question d'origine concernait l'implémentation de String.format(). Donc mon suivi serait mieux posé car "Puisque l'implémentation de String.format() dépend de StringBuilder dans l'implémentation d'Oracle, et puisque nous savons que StringBuilder n'est PAS thread-safe, cela signifie-t-il que l'implémentation de String.format() dans Jdk d'Oracle n'est pas non plus thread-safe? " – fooMonster

Questions connexes