以下是codingbat的问题.
给定一个字符串,返回一个字符串,其中对于原始字符中的每个字符,有两个字符.例如:
Run Code Online (Sandbox Code Playgroud)doubleChar("The") ? "TThhee" doubleChar("AAbb") ? "AAAAbbbb" doubleChar("Hi-There") ? "HHii--TThheerree"
我有两个语句可以做到这一点,但注释中的语句没有给出例外输出:
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),则输出是必需的.我无法理解这一点.如果连接没有,则它不适用于任何一种情况.你能帮帮我吗?
该方法public char charAt(int index)返回一个char,所以该行
str1 += str.charAt(i) + str.charAt(i);
Run Code Online (Sandbox Code Playgroud)
+在两个chars 上执行操作符.
根据Java规范:
15.18.加法运算符
运算符+和 - 称为加法运算符.
Run Code Online (Sandbox Code Playgroud)AdditiveExpression: MultiplicativeExpression AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression加法运算符具有相同的优先级,并且在语法上是左关联的(它们从左到右分组).
如果+运算符的任一操作数的类型是
String,则操作是字符串连接.否则,+运算符的每个操作数的类型必须是可转换(第5.1.8节)到原始数字类型的类型,否则会发生编译时错误.
在每种情况下,二元运算符的每个操作数的类型必须是可转换(第5.1.8节)到原始数字类型的类型,否则会发生编译时错误.
所以char +是char的补充,而不是连接.
每个char实际上都是一个解释为字符的整数值.
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)
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)