Concatenation of Strings and characters
The following statements,
String string = "string";
string = string +((char)65) + 5;
System.out.println(string);
Produce the output stringA5
.
The following however,
String string = "string";
string += ((char)65) + 5;
System.out.println(string);
Produce string70
.
Where is the difference?
Solution 1:
You see this behavior as a result of the combination of operator precedence and string conversion.
JLS 15.18.1 states:
If only one operand expression is of type String, then string conversion (§5.1.11) is performed on the other operand to produce a string at run time.
Therefore the right hand operands in your first expression are implicitly converted to string: string = string + ((char)65) + 5;
For the second expression however string += ((char)65) + 5;
the +=
compound assignment operator has to be considered along with +
. Since +=
is weaker than +
, the +
operator is evaluated first. There we have a char
and an int which results in a binary numeric promotion to int
. Only then +=
is evaluated, but at this time the result of the expression involving the +
operator has already been evaluated.
Solution 2:
Case 1
string = string +((char)65) + 5;
everything is treated as String but in second case
Sequence of operation performed:
string +((char)65 = stringA
stringA + 5 = stringA5
Case 2
string += ((char)65) + 5;
first right hand side is calculated means first operation will be like ((char)65) + 5
, So result of ((char)65) + 5 is 70
and after that += operation.
Sequence of operation performed:
(char)65 + 5 = 70
string + 70 = string70
Lets see 1 more example
String string = "string";
string += ((char)65) + 5 + "A";
System.out.println(string);
Output string70A
Reason Same first right hand side is calculated and sequesce of opertion performed is
(char)65 + 5 = 70
70 + "A" = 70A
string + 70A = string70A