Pourquoi en Java vous pouvez ajouter des chaînes avec l'opérateur +, alors que String est une classe? Dans le String.java
code, je n'ai trouvé aucune implémentation pour cet opérateur. Ce concept viole-t-il l'orientation de l'objet?
129
+
opérateur Plus ( ) est une fonctionnalité de langage de Java.Réponses:
Regardons les expressions simples suivantes en Java
Le compilateur se convertit
"x = "+x;
en un enStringBuilder
interne et utilise.append(int)
pour "ajouter" l'entier à la chaîne.5.1.11. Conversion de chaîne
15.18.1.
La version optimisée ne fera pas d'abord une conversion de chaîne complète.
Ceci est une bonne illustration d'une version optimisée utilisée par le compilateur, bien que sans la conversion d'une primitive, où vous pouvez voir le compilateur changer les choses en StringBuilder en arrière-plan:
http://caprazzi.net/posts/java-bytecode-string-concatenation-and-stringbuilder/
Ce code java:
Génère ceci - voyez comment les deux styles de concaténation mènent au même bytecode:
En regardant l'exemple ci-dessus et comment le code d'octet basé sur le code source dans l'exemple donné est généré, vous pourrez remarquer que le compilateur a transformé en interne l'instruction suivante
dans
En d'autres termes, l'opérateur
+
dans la concaténation de chaînes est en fait un raccourci pour l'StringBuilder
idiome plus verbeux .la source
C'est la fonction du compilateur Java qui vérifie les opérandes de l'
+
opérateur. Et basé sur les opérandes, il génère le code d'octet:Voici ce que dit la spécification Java :
la source
Ce n'est pas le cas. Le compilateur le fait. Strictement parlant, le compilateur surcharge l'opérateur + pour les opérandes String.
la source
Tout d'abord (+) est surchargé et non remplacé
Si l'opérande de gauche est String, il fonctionne comme une concaténation.
Si l'opérande de gauche est Integer, il fonctionne comme opérateur d'addition
la source
int
et les règles normales de Java s'appliquent.Le langage Java fournit un support spécial pour l'opérateur de concaténation de chaînes (+) et pour la conversion d'autres objets en chaînes. La concaténation de chaînes est implémentée via la classe
StringBuilder
(ouStringBuffer
) et saappend
méthode.la source
La signification de l'
+
opérateur lorsqu'il est appliqué àString
est définie par le langage, comme tout le monde l'a déjà écrit. Puisque vous ne semblez pas trouver cela suffisamment convaincant, considérez ceci:Les entiers, les flottants et les doubles ont tous des représentations binaires différentes, et donc ajouter deux entiers est une opération différente, en termes de manipulation de bits, que d'ajouter deux flottants: pour les entiers, vous pouvez ajouter petit à petit, en portant un bit et en vérifiant le débordement; pour les flotteurs, vous devez traiter les mantisses et les exposants séparément.
Ainsi, en principe, «l'addition» dépend de la nature des objets «ajoutés». Java le définit pour les chaînes ainsi que pour les entiers et les flottants (longs, doubles, ...)
la source
L'
+
opérateur est généralement remplacé par unStringBuilder
au moment de la compilation. Vérifiez cette réponse pour plus de détails à ce sujet.la source
+
opérateur n'est pas remplacé parStringBuilder
?