java - Combien d'objets String seraient créés lors de la concaténation de plusieurs chaînes?




string-concatenation string-pool (5)

Lors d’une interview, on m’a demandé quel était le nombre d’objets créés sur le problème donné:

String str1 = "First";
String str2 = "Second";
String str3 = "Third";
String str4 = str1 + str2 + str3;

J'ai répondu qu'il y aurait 6 objets créés dans le pool de chaînes.

3 serait pour chacune des trois variables.
1 serait pour str1 + str2 (disons str ).
1 serait pour str2 + str3 .
1 serait pour le str + str3 ( str = str1 + str2 ).

La réponse que j'ai donnée est-elle correcte? Si non, quelle est la bonne réponse?


4 objets de chaîne seront créés dans le pool de constantes de chaînes. 3 pour les littéraux et 1 avec concaténation.

si on utilise

String s1 = new String("one")

il créera deux objets, un en pool constant et un en mémoire heap.

si on définit:

String s1 = "one";
String s2 = new String("one");

il créera deux objets, un en pool constant et un en mémoire heap.


Avec l'information donnée, la question ne peut pas être résolue. Comme indiqué dans le JLS, §15.18.1 :

... Pour augmenter les performances de la concaténation de chaînes répétée, un compilateur Java peut utiliser la classe StringBuffer ou une technique similaire pour réduire le nombre d'objets String intermédiaires créés lors de l'évaluation d'une expression.

Cela signifie que la réponse dépend au moins du compilateur Java concret utilisé.

Je pense que le mieux que nous puissions faire est de donner un intervalle comme réponse:

  • un compilateur intelligent peut en déduire que str1 à str3 ne sont jamais utilisés et plier la concaténation lors de la compilation, de sorte qu'un seul objet String soit créé (celui référencé par str4 )
  • Le nombre maximum de String s créées doit être de 5: un pour str1 à str3 , un pour tmp = str1 + str2 et un pour str4 = tmp + str3 .

Donc ... ma réponse serait "quelque chose entre un à cinq objets- String ". Quant au nombre total d'objets créés uniquement pour cette opération ... je ne sais pas. Cela peut également dépendre de la manière dont, par exemple, StringBuffer est implémenté.

En passant: je me demande quelle est la raison de poser de telles questions. Normalement, on n'a pas besoin de se soucier de ces détails.


Java 8 créera probablement 5 objets:

  • 3 pour les 3 littéraux
  • 1 StringBuilder
  • 1 pour la String concaténée

Avec Java 9, les choses ont bien changé et la concaténation de String n’utilise plus StringBuilder .


L'opération de concaténation ne crée pas ces nombreux objets String. Il crée un StringBuilder puis ajoute les chaînes. Donc, il peut y avoir 5 objets, 3 (variables) + 1 (sb) + 1 (chaîne concaténée).


Une implémentation Java conforme peut concaténer les chaînes de plusieurs manières, au moment de l'exécution ou de la compilation, nécessitant un nombre quelconque d'objets d'exécution, y compris des objets nuls, si elle détecte que le résultat n'est pas nécessaire au moment de l'exécution.





string-building