J'essaie de comprendre quelle est la meilleure pratique et pourquoi de concaténer des littéraux de chaîne et des variables pour différents cas. Par exemple, si j'ai un code comme celui-ci
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String).append("CCCCCCCCCCC").append(D_String)
.append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
Est-ce la façon de le faire? De this post , j’ai remarqué que l’opérateur +
sur Strings crée une nouvelle instance de StringBuilder, concatène les opérandes et renvoie une conversion de chaîne, ce qui semble être beaucoup plus laborieux que d’appeler simplement .append()
; donc si c'est vrai, alors c'est hors de question. Mais qu'en est-il de String.concat()
? Est-il approprié d'utiliser .append()
pour chaque concaténation? Ou juste pour les variables, et les littéraux peuvent être ajoutés avec .concat()
?
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String.concat("CCCCCCCCCCC")).append(D_String
.concat("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.concat("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));
Quelles sont les règles générales des meilleures pratiques et performances pour résoudre ces situations? Mon hypothèse est-elle correcte sur +
et ne devrait-elle pas être utilisée?
+
opérateurString s = s1 + s2
En coulisse, cela se traduit par:
String s = new StringBuilder(s1).append(s2).toString();
Imaginez combien de travail supplémentaire cela ajoute si vous avez s1 + s2
ici:
stringBuilder.append(s1 + s2)
au lieu de:
stringBuilder.append(s1).append(s2)
+
A noter que:
String s = s1 + s2 + s3 + ... +sN
est traduit en:
String s = new StringBuilder(s1).append(s2).append(s3)...apend(sN).toString();
concat()
String s = s1.concat(s2);
String
crée un tableau char[]
qui peut contenir à la fois s1
et s2
. Copie le contenu de s1
et s2
dans ce nouveau tableau. Nécessite en réalité moins de travail que l'opérateur +
.
StringBuilder.append()
Maintient un tableau interne char[]
qui se développe lorsque cela est nécessaire. Aucun char[]
supplémentaire n'est créé si le code interne est suffisamment grand.
stringBuilder.append(s1.concat(s2))
fonctionne également mal, car s1.concat(s2)
crée un tableau char[]
supplémentaire et y copie s1
et s2
uniquement pour copier le contenu du nouveau tableau dans internal StringBuilder
char[]
.
Ceci étant dit, vous devez utiliser append()
tout le temps et ajouter des chaînes brutes (votre premier extrait de code est correct).
Le compilateur optimise la + concaténation.
Alors
int a = 1;
String s = "Hello " + a;
est transformé en
new StringBuilder().append("Hello ").append(1).toString();
Il y a un excellent sujet ici expliquant pourquoi vous devriez utiliser l'opérateur +.
L'optimisation est faite automatiquement par le compilateur.
Le compilateur Java2 convertira automatiquement les éléments suivants:
String s = s1 + s2;
à
String s = (new StringBuffer()).append(s1).append(s2).toString();
Tiré directement du site Web Meilleures pratiques Java sur Oracles.
Vous devriez toujours utiliser append
.
concat
créer une nouvelle chaîne de sorte qu'il ressemble assez à +
je pense.
Si vous concat
ou utilisez +
avec 2 String final, la machine virtuelle Java peut procéder à l'optimisation.
Si vous concattez exactement deux chaînes, utilisez String.concat (crée une nouvelle chaîne en créant un nouveau tableau de caractères qui convient à la fois à Strings et y copie les tableaux de caractères des deux chaînes).
Si vous concaténisez plusieurs chaînes (plus de deux) sur une ligne, utilisez + ou StringBuilder.append, cela n'a pas d'importance, car le compilateur convertit + en StringBuilder.append. C'est bon pour plusieurs chaînes car il maintient un tableau de caractères qui grandit selon les besoins.
Si vous concaténisez plusieurs chaînes sur plusieurs lignes, créez un StringBuilder et utilisez la méthode append. En fin de compte, lorsque vous avez terminé d'ajouter des chaînes au StringBuilder, utilisez la méthode .toString () - pour créer une chaîne à partir de celle-ci . un nouveau StringBuilder sur chaque ligne, ajoutez les chaînes, puis reconvertissez-les en chaînes, tandis que la troisième méthode utilise un seul StringBuilder pour l'ensemble.
Utiliser l'opérateur +
est la meilleure pratique, il est également simple et lisible.
Le langage Java fournit un support spécial pour la chaîne concaténation (+), et pour la conversion d’autres objets en des cordes. La concaténation de chaînes est implémentée via le fichier StringBuilder (ou StringBuffer) et sa méthode d'ajout.
Document officiel: https://docs.Oracle.com/javase/8/docs/api/Java/lang/String.html
au niveau du code octet, il n'y a pas de différence et nous ne compromettons pas l'efficacité. En cas d'exécution au niveau du code d'octet, il doit passer par la méthode de surcharge non en ligne de l'opérateur pour + en appelant append. puis au niveau du langage Assembly (Java est écrit en C et C produit des assemblages similaires à Assembly, il y aura un appel de registre supplémentaire pour stocker + un appel de méthode dans la pile et il y aura un Push supplémentaire. appel, dans ce cas, ne faisant aucune différence avec l'efficacité.)
Il est recommandé d’avoir un moyen d’augmenter la lisibilité. :)