8
votes

+ Opérateur pour chaîne en Java

J'ai vu Cette question Il y a quelques minutes, et a décidé de jeter un coup d'oeil dans la chaîne Java classe à vérifier s'il y avait une surcharge sur l'opérateur + .

Je n'ai pu trouver rien, mais je sais que je peux faire ce xxx < p> Où est-ce mis en œuvre?


0 commentaires

7 Réponses :


2
votes

Il est manipulé par le compilateur.


4 commentaires

Réponse impressionnante. Avez-vous envisagé d'être enseignant?


@Willi Schönborn: Eh bien, c'est la réponse simple et correcte. Je n'avais pas le temps d'écrire plus quand je l'ai écrit et quand je suis rentré à l'ordinateur, il y avait beaucoup de réponses l'expliquant plus en détail. Désolé de dire, mais je ne vois pas le point de faire dupliquer les autres réponses, je vous recommande de lire @ Sean's et @ Jleedev's Si vous avez besoin de plus d'informations (et oui, l'enseignement est sur mon CV).


Le but est que votre réponse est si générale, elle convient à près de 6 75% de toutes les questions liées à Java.


@Will Schönborn 75% de tous les problèmes Java ne sont pas gérés par le compilateur. En fait, dans la plupart des cas, le compilateur compilait simplement la source du code octet. Les quelques exceptions près sont l'opérateur + sur la chaîne et quelques points où le résultat est l'allusion de la fonction intrinsèque. Ma réponse a d'abord été entrée avec la seule intention d'être une réponse rapide pour pointer le PO dans la bonne direction en attendant des réponses plus complètes. J'avais comme 30 ans à épargner avant une réunion et les a consacrées à cela. Si vous n'aimez pas cela, veuillez aller visiter le site d'un trait d'union ou quelque chose ou construire un représentant vous-même au lieu de vous plaindre.



13
votes

du Fine Manuel : < / p>

La langue Java fournit un support spécial pour l'opérateur de concaténation de chaîne (+) et pour la conversion d'autres objets vers des chaînes. La concaténation de la chaîne est implémentée via le StringBuilder (ou Stringbuffer ) et son Ajoutez méthode. Les conversions de chaîne sont implémentées via la méthode Tostring, définie par objet et héritée par toutes les classes de Java. Pour plus d'informations sur la concaténation et la conversion des chaînes, voir Gosling, Joy et Steele, la spécification de langue Java .

voir Concaténation de chaîne dans les JLS.


2 commentaires

StringBuilder doit être préféré où la synchronisation n'est pas une préoccupation.


@gpampara Le compilateur sait utiliser StringBuilder. Stringbuffer a été utilisé dans d'anciennes versions avant l'introduction de StringBuilder.



0
votes

C'est fait au niveau de la langue. La spécification de langue java est très spécifique à propos de la chaîne l'ajout doit faire .


0 commentaires

2
votes

Ceci est un comportement spécial documenté dans le Spécification de la langue .

15.18.1 Opérateur de concaténation à chaîne +

Si une seule expression opérande est de Tapez la chaîne, puis la conversion de chaîne est effectué sur l'autre opérande à produire une chaîne au moment de l'exécution. Les Le résultat est une référence à une chaîne objet (nouvellement créé, à moins que le expression est une constante de la compilation expression (§15.28)) c'est le Concaténation des deux opérandes cordes. Les personnages de la l'opérande de gauche précédent la caractères de l'opérande de droite dans la chaîne nouvellement créée. Si un Opérande de la chaîne de type est NULL, puis la chaîne "null" est utilisée à la place de cet opérande.


0 commentaires

8
votes

Le compilateur traite votre code comme si vous aviez écrit quelque chose comme:

0:  ldc #2; //String ab
2:  astore_1
3:  ldc #3; //String cd
5:  astore_2
6:  new #4; //class java/lang/StringBuilder
9:  dup
10: invokespecial   #5; //Method java/lang/StringBuilder."<init>":()V
13: aload_1
14: invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual   #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: return


0 commentaires

0
votes

String est défini comme un type standard comme Int, Double, Float, etc. Au niveau du compilateur. Essentiellement, tous les compilateurs ont une surcharge de l'opérateur. La surcharge de l'opérateur n'est pas définie pour les développeurs (contrairement à C ++).

Assez intéressant: cette question a été consignée comme un bogue: http: // bugs. Sun.com/view_bug.doo?bug_id=4905919


0 commentaires

3
votes

La plupart des réponses ici sont correctes (elle est gérée par le compilateur, + est convertie en .append () ...)

Je voulais ajouter que tout le monde devrait examiner le code source de chaîne et appendez-vous. À un moment donné, c'est assez impressionnant.

Je crois que cela est tombé à quelque chose comme: xxx

= xxx

Mais alors une magie arrive. Cela se transforme en:

  • Créez une gamme de chaînes de longueur 3
  • Copiez A dans la première position.
  • Copie B dans la seconde
  • Copie C dans le troisième

    alors que la plupart des gens croient que cela créera "AB", puis le jeter quand il crée "ABC". Cela comprenne réellement que c'est enchaînant et fait une certaine manipulation.

    Il y a aussi un tour où si vous avez la chaîne "ABC" et que vous demandez une sous-chaîne qui s'avère être "BC", ils peuvent Partagez le même tableau sous-jacent. Vous remarquerez qu'il existe une position de départ, une position finale et un drapeau "partagé".

    En fait, s'il n'est pas partagé, il est possible de prolonger la longueur d'une chaîne et de copier les autres .

    Maintenant, je suis simplement déroutant. Lisez le code source - c'est assez cool.


1 commentaires

Il n'y a pas de nouvelle chaîne (). Ajoutez ("A"). Ajoutez ("B"). Ajoutez ("C") , mais New StringBuilder (). ANNEXE ("A" ) .append ("b) .append (" c "). Tostring () . Le No-StringBuilder Way serait " A ". Concat (" B ")