web-dev-qa-db-fra.com

Quand dois-je utiliser StringBuilder ou StringBuffer?

Dans une application Web de production, mes collègues programmeurs ont utilisé StringBuffer partout. Maintenant, je m'occupe du développement et des corrections d'applications. Après avoir lu StringBuilder et StringBuffer , j'ai décidé de remplacer tout le code StringBuffer par StringBuilder car nous n'avons pas besoin de la sécurité des threads dans nos beans de données.

Par exemple: (Dans chaque bean de données, je peux voir l'utilisation de StringBuffer)

@Override
public String toString() {
    StringBuffer sb = new StringBuffer();// replace it from StringBuilder
    sb.append(" ABCD : ").append(abcd);
    sb.append(", EFGH : ").append(efgh);
    sb.append(", IJKL : ").append(ijkl);
}

Nous créons des beans de données séparés pour chaque session/demande. Une session est utilisée par un seul utilisateur, aucun autre utilisateur ne peut y accéder.

Dois-je considérer d'autres points avant de migrer?

S'il y a un seul thread (aucun thread en attente/aucun nouveau thread ne recherchera de verrouillage d'objet), il fonctionne de la même manière avec StringBuffer ou StringBuilder. Je sais que dans le cas de StringBuffer, il faut du temps pour prendre le verrou d'objet, mais je veux savoir s'il y a une différence de performances entre eux, sauf le maintien/relâchement du verrou d'objet.

13
Satish Pandey

La seule différence entre les deux est la synchronisation utilisée dans StringBuffer. La surcharge de synchronisation n'est pas énorme dans le grand schéma des choses, mais elle est importante par rapport aux méthodes StringBuilder qui ne les ont pas. La JVM fait un travail qu'elle n'aurait pas dû faire autrement - en particulier avec un seul thread, etc.

Si votre code fonctionne et que les gens ne se plaignent pas des performances, je ne m'en inquiéterais pas. Vous n'allez pas en avoir pour votre argent. Cependant, si vous écrivez du nouveau code ou mettez à jour du code qui utilise StringBuffer, je suggère de les convertir en même temps StringBuilder.

22
Matthew Flynn

StringBuilder a été ajouté à un moment donné (Java 1.5) pour être un StringBuffer meilleur et plus rapide et le compilateur l'utilise sous le capot pour implémenter le + opérateur sur les chaînes.

Cela signifie qu'en utilisant StringBuilder, vous ne pouvez pas faire exécuter votre code sur des machines JVM plus anciennes que lorsque la classe a été introduite. Ce serait un problème pour nous, pour un moment encore. Si vous exécutez toujours la dernière version, vous n'avez pas besoin de vous en soucier.

Je ne voudrais pas passer par le processus d'optimisation que vous traversez, mais pour les raisons suivantes.

  • En dehors des boucles serrées, l'avantage est négligeable. À moins qu'il n'apparaisse explicitement comme un hotspot dans un profileur, je ne me dérangerais pas.
  • La modification du code peut introduire des erreurs et vous devez tester à nouveau votre application à fond. Cela peut être beaucoup plus cher que de vivre avec une classe synchronisée dans un cadre non synchronisé.
8
user1249