ProgrammationDéveloppeur Java

Décrivez les caractéristiques du travail avec des chaînes en Java, comment fonctionnent String/StringBuilder/StringBuffer, quand les utiliser et quels écueils sont liés à leur utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Java, la classe String est immutable : à chaque opération de modification, un nouvel objet est créé. Les classes StringBuilder et StringBuffer sont mutables, utilisées pour les concaténations dans les boucles et les transformations complexes.

Différences clés :

  • String : immutable, thread-safe sans synchronisation supplémentaire. Idéal pour du texte lisible et immuable (par exemple, clés, messages).
  • StringBuilder : mutable, non thread-safe, mais concaténation rapide. Utilisé là où les chaînes sont modifiées de nombreuses fois.
  • StringBuffer : mutable, thread-safe (méthodes synchronisées), mais moins performant que StringBuilder.

Exemple de comparaison de vitesse :

String s = ""; for (int i = 0; i < 10000; i++) { s += i; // crée à chaque fois une nouvelle chaîne, lent ! } // Mieux ainsi : StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString();

Écueils :

  • Des concaténations excessives de chaînes immutables entraînent des fuites de mémoire et une dégradation des performances.
  • String.intern() peut provoquer une OutOfMemoryError dans PermGen/Metaspace avec un grand nombre de chaînes uniques.
  • L'utilisation incorrecte de StringBuilder dans des scénarios multithreading peut entraîner des conditions de course.

Question piège.

Question : "La concaténation de chaînes avec l'opérateur "+" dans une boucle est-elle efficace ?"

Réponse : Non, à chaque fois, un nouvel objet String est créé, ce qui surcharge beaucoup la mémoire et le GC. Pour de nombreuses opérations, il est préférable d'utiliser StringBuilder ou StringBuffer (si la sécurité des threads est requise).

Exemple :

String s = ""; for (int i = 0; i < 1000; i++) { s += i; // TRÈS inefficace ! } // vs StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); }

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


Histoire

Dans un projet bancaire, la concaténation de chaînes avec l'opérateur "+" dans une grande boucle a ralenti l'analyse nocturne de 15 fois. Le problème a été résolu en remplaçant par StringBuilder, le temps d'exécution étant réduit de 40 minutes à 2.


Histoire

Un jeune développeur s'est trompé avec les threads et a utilisé StringBuilder dans le même objet-facade, auquel plusieurs threads accédaient simultanément. Cela a conduit à des bogues intermittents et à des résultats incorrects en raison du manque de synchronisation.


Histoire

Dans un projet, des étiquettes uniques étaient créées à l'aide de String.intern(). Avec l'augmentation du nombre d'utilisateurs à des dizaines de millions, la JVM a commencé à lancer OutOfMemoryError : PermGen space. Le problème a été résolu en abandonnant l'utilisation de intern() et en passant à d'autres mécanismes de mise en cache.