带有charAt()方法的String上的Java + =运算符导致char加法

时间:2014-07-24 15:54:22

标签: java string operators charat

我正在解决Codingbat.com上的问题,并且碰到了+=运算符,a += b不一定与a = a + b完全相等的事实。这是众所周知的,之前已经在SO上进行了讨论,但是当我使用charAt()方法结合我无法理解的上述语法时,我发生了一些奇怪的事情。

说我有两个变量:

String str    = "The";
String result = "";

我想将“str”中的第一个字母添加两次到“结果”。一种方法是:

result = result + str.charAt(0) + str.charAt(0);

会产生result = "TT"

但是,如果我使用+=运算符,例如:

result += str.charAt(0) + str.charAt(0);

我得到result = "168"。很明显,字符添加已经发生('T'的ASCII代码是84,84 * 2 = 168)。

我想知道在第一种情况下使用+=运算符实际发生了什么。根据{{​​3}}:E1 op= E2相当于E1 = (T)((E1) op (E2))。所以我希望后一个表达式输出"168"就像使用+=运算符一样。但以下输出"TT"正确,而不是"168"

result = (String)(result + str.charAt(0) + str.charAt(0));

我是否误解了文档?我还在SO上发现docs on assignment operators表明str1 += str2相当于:

str1 = new StringBuilder().append(str1).append(str2).toString();

但评估以下内容:

result = new StringBuilder().append(str.charAt(0)).append(str.charAt(0)).toString();

仍然导致"TT",而不是"168"

对不起,很长的帖子!我只是对将charAt()与字符串和+=结合使用时发生的事情感到好奇,因为我发现了两个“等价物”(如果我将它们从两个翻译成三个正确的术语)不会产生相同的结果。

3 个答案:

答案 0 :(得分:7)

result = result + str.charAt(0) + str.charAt(0);

result是一个字符串,因此第一个+执行字符串连接,生成另一个字符串。第二个+,通过相同的逻辑,也将执行字符串连接。这给出了期望的结果。

result += str.charAt(0) + str.charAt(0);

首先评估右侧str.charAt(0) + str.charAt(0)。现在,您要添加两个字符,其工作方式类似于添加简单整数,添加ASCII值。然后,我们将此结果(在这种情况下为int - 84)附加到result,这就是您所看到的。

char c = 'T';
System.out.println(c + c);
168

这里的潜在差异只是评估事物的顺序。

答案 1 :(得分:5)

正如您在问题中所述E1 op= E2相当于E1 = (T)((E1) op (E2))。这一行

result += str.charAt(0) + str.charAt(0);

相当于

result = (String) ((result) + (str.charAt(0) + str.charAt(0)));

(注意添加char的括号,它们很重要)

这将评估为

result = (String) (("") + ('T' + 'T'));
result = (String) (("") + (168));
result = (String) ("168");
result = "168";

如果没有括号,你会得到

result = (String) ("" + 'T' + 'T');
result = (String) ("T" + 'T');
result = (String) ("TT");
result = "TT";

答案 2 :(得分:2)

str.charAt(0) + str.charAt(0)

在作业+=发生之前作为一个整体进行评估。

charAt返回char,其中的加法定义为整数。因此,这与:

相同
result = result + (str.charAt(0) + str.charAt(0));