String与字符的串联如何在Java中工作?

kus*_*sur 1 java string

以下是codingbat的问题.

给定一个字符串,返回一个字符串,其中对于原始字符中的每个字符,有两个字符.例如:

doubleChar("The") ? "TThhee"
doubleChar("AAbb") ? "AAAAbbbb"
doubleChar("Hi-There") ? "HHii--TThheerree"
Run Code Online (Sandbox Code Playgroud)

我有两个语句可以做到这一点,但注释中的语句没有给出例外输出:

public String doubleChar(String str) {
    String str1 = "";
    for(int i=0;i<str.length();i++)
    {
        //str1 += str.charAt(i) + str.charAt(i);
        str1 += str.substring(i,i+1)+str.substring(i,i+1);
    }
    return str1;
}
Run Code Online (Sandbox Code Playgroud)

如果我将注释部分更改为str1 = str1 + str.charAt(i) + str.charAt(i),则输出是必需的.我无法理解这一点.如果连接没有,则它不适用于任何一种情况.你能帮帮我吗?

The*_*Hat 6

该方法public char charAt(int index)返回一个char,所以该行

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

+在两个chars 上执行操作符.

根据Java规范:

15.18.加法运算符

运算符+和 - 称为加法运算符.

AdditiveExpression:
    MultiplicativeExpression
    AdditiveExpression + MultiplicativeExpression
    AdditiveExpression - MultiplicativeExpression
Run Code Online (Sandbox Code Playgroud)

加法运算符具有相同的优先级,并且在语法上是左关联的(它们从左到右分组).

如果+运算符的任一操作数的类型是String,则操作是字符串连接.

否则,+运算符的每个操作数的类型必须是可转换(第5.1.8节)到原始数字类型的类型,否则会发生编译时错误.

在每种情况下,二元运算符的每个操作数的类型必须是可转换(第5.1.8节)到原始数字类型的类型,否则会发生编译时错误.

所以char +是char的补充,而不是连接.

每个char实际上都是一个解释为字符的整数值.

Java规范的第15.15.3节说:

15.15.3.一元加运算符+

一元+运算符的操作数表达式的类型必须是可转换(第5.1.8节)到原始数字类型的类型,否则会发生编译时错误.

对操作数执行一元数字提升(第5.6.1节).一元加表达式的类型是操作数的提升类型.一元加表达式的结果不是变量,而是值,即使操作数表达式的结果是变量.

在运行时,一元加表达式的值是操作数的提升值.

因此,添加两个chars会产生一个int.当你+=这样int,它被转换为String连接到所述字符串.

要解决此问题,您可以使用此问题的任何答案:如何将char转换为String?,例如

str1 += String.valueOf(str.charAt(i)) + str.charAt(i);
Run Code Online (Sandbox Code Playgroud)

要么

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


Mar*_*iot 6

str.charAt(i)返回a char,char在a中添加两个s结果,char其中codepoint等于输入代码点的总和.当你开始时str +,第一个连接是在a String和a 之间char,这导致a String,然后是第二个连接,也是a String和a 之间的连接char.

您可以通过以下几种方式解决此问题,例如:

str1 += String.valueOf(str.charAt(i)) + str.charAt(i);
Run Code Online (Sandbox Code Playgroud)

要么

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

或者,正如您已经发现的那样,并且可能最具可读性:

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