【问题标题】:Java += operator on String with charAt() methods results in char addition带有 charAt() 方法的 String 上的 Java += 运算符导致 char 添加
【发布时间】:2014-09-16 06:59:38
【问题描述】:

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

假设我有两个变量:

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

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

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)。

我想知道在第一种情况下使用+= 运算符时实际发生了什么。根据docs on assignment operatorsE1 op= E2等价于E1 = (T)((E1) op (E2))。所以我希望后一个表达式输出"168",就像使用+= 运算符一样。但以下输出正确的是"TT",而不是"168"

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

我是否误解了文档?我还在 SO 上发现了一个 answer,这表明 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() 与 String 和 += 结合使用时实际发生了什么,因为我发现的两个“等价物”(如果我正确地将它们从两到三个术语翻译)确实不会产生相同的结果。

【问题讨论】:

  • 说“不要那样做”就足够了吗?如果没有,请查看operator precedence
  • 不,我可以轻松超越这个问题,但我也想从中学习。感谢您的链接!我总是忘记考虑运算符优先级。
  • 有点像西班牙宗教裁判所。
  • 没人期待西班牙宗教裁判所!

标签: java string operators charat


【解决方案1】:
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

这里的根本区别只是评估事物的顺序。

【讨论】:

    【解决方案2】:

    正如您在问题中所述,E1 op= E2 等同于E1 = (T)((E1) op (E2))。所以这条线

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

    等价于

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

    (注意字符加法周围的括号,它们很重要)

    这将评估为

    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";
    

    【讨论】:

      【解决方案3】:
      str.charAt(0) + str.charAt(0)
      

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

      charAt 返回一个char,在其上定义加法就像在整数上一样。因此,这与:

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

      【讨论】:

        猜你喜欢
        • 2017-02-26
        • 2015-02-15
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 2013-08-10
        • 2021-02-01
        • 2019-05-19
        相关资源
        最近更新 更多