形成字符串的字符串联会产生不同的结果

Ron*_*tro 10 java string concatenation char

为什么,当我使用下面的操作来计算字符时,它是否返回数字而不是字符?它不应该给出相同的结果吗?

ret += ... ; // returns numbers

ret = ret + ...; // returns chars
Run Code Online (Sandbox Code Playgroud)

下面的代码重复了字符:

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;
}
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 11

以下表达式的结果

ret + str.charAt(i) + str.charAt(i); 
Run Code Online (Sandbox Code Playgroud)

是字符串连接的结果.Java语言规范说明

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

的结果

str.charAt(i) + str.charAt(i); 
Run Code Online (Sandbox Code Playgroud)

是添加运算符应用于两种数字类型的结果.Java语言规范说明

当应用于两个数值类型的操作数时,binary +运算符执行加法,产生操作数的总和.[...]数字操作数上的加法表达式的 类型是其操作数的提升类型.

在这种情况下

str.charAt(i) + str.charAt(i); 
Run Code Online (Sandbox Code Playgroud)

成为int持有两个char值的总和.然后连接到ret.


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

除了 仅计算一次之外,表单的复合赋值表达式E1 op= E2等效于E1 = (T) ((E1) op (E2)),where T的类型.E1E1

换一种说法

ret += str.charAt(i) + str.charAt(i);
Run Code Online (Sandbox Code Playgroud)

相当于

ret = (String) ((ret) + (str.charAt(i) + str.charAt(i)));
                      |                ^ integer addition
                      |
                      ^ string concatenation
Run Code Online (Sandbox Code Playgroud)

  • 我看到的另一个优点是加法运算符是从左到右关联的.因此`str.charAt(i)+ str.charAt(i)+ ret`也将以数字方式添加字符. (3认同)