Concaténation de chaînes et de caractères

Les déclarations suivantes,

Ssortingng ssortingng = "ssortingng"; ssortingng = ssortingng +((char)65) + 5; System.out.println(ssortingng); 

Produire la ssortingngA5 .


Les suivants cependant,

 Ssortingng ssortingng = "ssortingng"; ssortingng += ((char)65) + 5; System.out.println(ssortingng); 

Produire une ssortingng70 .

Où est la différence?

Ce comportement résulte de la combinaison de la priorité des opérateurs et de la conversion de chaînes.

JLS 15.18.1 déclare:

Si une seule expression d’opérande est de type Ssortingng, la conversion de chaîne (§5.1.11) est effectuée sur l’autre opérande pour produire une chaîne au moment de l’exécution.

Par conséquent, les opérandes de droite de votre première expression sont implicitement convertis en chaîne: ssortingng = ssortingng + ((char)65) + 5;

Pour la deuxième expression, cependant, ssortingng += ((char)65) + 5; l’opérateur d’opération composé += doit être considéré avec + . Puisque += est plus faible que + , l’opérateur + est évalué en premier. Là, nous avons un char et un int qui résulte en une promotion numérique binary à int . Seulement alors += est évalué, mais à ce jour, le résultat de l’expression impliquant l’opérateur + a déjà été évalué.

Cas 1

 ssortingng = ssortingng +((char)65) + 5; 

tout est traité comme Ssortingng mais dans le second cas

Séquence d’opération effectuée:

  • ssortingng +((char)65 = ssortingngA
  • ssortingngA + 5 = ssortingngA5

Cas 2

  ssortingng += ((char)65) + 5; 

premier côté droit est calculé signifie que la première opération sera comme ((char)65) + 5 , donc le résultat de ((char)65) + 5 is 70 et après que + = opération.

Séquence d’opération effectuée:

  • (char)65 + 5 = 70
  • ssortingng + 70 = ssortingng70

Permet de voir 1 autre exemple

 Ssortingng ssortingng = "ssortingng"; ssortingng += ((char)65) + 5 + "A"; System.out.println(ssortingng); 

Chaîne de sortie70A

Raison Le même premier côté droit est calculé et la séparation des opérations effectuée est

  • (char)65 + 5 = 70
  • 70 + "A" = 70A
  • ssortingng + 70A = ssortingng70A

Lorsque vous écrivez:

 ssortingng = ssortingng + ((char)65) + 5; 

C’est comme écrire:

 Ssortingng ssortingng = new SsortingngBuilder(ssortingng).append((char)65).append((int)5).toSsortingng(); 

Ce qui équivaut à append une ssortingng à A (la représentation du caractère décimal 65) et 5 .

Dans ce dernier cas, vous calculez d’abord la main droite, puis ajoutez le résultat à la ssortingng , c’est comme écrire:

 ssortingng = ssortingng + 70; 
 ssortingng = ssortingng +((char)65) + 5; 

Cela signifie “Définir la chaîne à la concaténation de la ssortingng , ((char)65) et 5 ” Cela est évalué de gauche à droite (donc première ssortingng + ((char)65) , alors que +5 , et concaténation d’une chaîne et d’un entier convertit cet entier en chaîne.

 ssortingng += ((char)65) + 5; 

Cela signifie “Calculez le résultat de ((char)65)+5 et ajoutez-le à la chaîne” – tout le côté droit est évalué avant d’append le résultat à la chaîne. Comme un caractère n’est qu’un nombre entier de 16 bits, il les ajoute sous la forme de nombres entiers – ce qui donne 70 – et ajoute ensuite cela à la ssortingng .

C’est le même cas que l’exemple:

 System.out.println("abc"+10 + 5); 

produit abc105 (append en tant que chaîne)

et

 System.out.println(5 + 10); 

produit 15 (append comme numéro)

La Ssortingng incluse dans l’opération (première place de l’opération) force tous les éléments à être traités comme des Ssortingngs lors de l’exécution de l’opération. Dans votre cas avec += cependant, l’opération est exécutée d’abord dans la partie droite (en traitant les éléments comme int ) en raison de la priorité de l’opérateur, puis est concaténée avec la Ssortingng .