一尘不染

字符串形成字符串的结果不同

java

为什么当我使用以下操作对字符求和时,它返回数字而不是字符?它不应该给出相同的结果吗?

ret += ... ; // returns numbers

ret = ret + ...; // returns chars

下面的代码复制了字符:

doubleChar(“ The”)→“ TThhee”

public String doubleChar(String str) {

    String ret = "";
    for(int i = 0; i < str.length(); i++) {
        ret = ret + str.charAt(i) + str.charAt(i); // it concatenates the letters correctly
        //ret += str.charAt(i) + str.charAt(i); // it concatenates numbers
    }
    return ret;
}

阅读 138

收藏
2020-09-08

共1个答案

一尘不染

以下表达式的结果

ret + str.charAt(i) + str.charAt(i);

是String连接的结果。Java语言规范说明

字符串串联的结果是对String对象的引用,该对象是两个操作数字符串的串联。在新创建的字符串中,左侧操作数的字符位于右侧操作数的字符之前。

的结果

str.charAt(i) + str.charAt(i);

是将加法运算符应用于两个数字类型的结果。Java语言规范说明

当应用于两个数字类型的操作数时,binary +运算符将执行加法运算,从而得出这些操作数的总和。[…]数字操作数上加法表达式的 类型是其操作数的
提升 类型。

在这种情况下

str.charAt(i) + str.charAt(i);

成为int两个char值的和。然后将其连接到ret


您可能还想了解有关复合赋值表达式的信息 +=

形式的复合赋值表达式E1 op= E2等效于E1 = (T) ((E1) op (E2)),其中T是的类型E1,不同之处在于该表达式E1 仅被评估一次。

换一种说法

ret += str.charAt(i) + str.charAt(i);

相当于

ret = (String) ((ret) + (str.charAt(i) + str.charAt(i)));
                      |                ^ integer addition
                      |
                      ^ string concatenation
2020-09-08