java为什么字符连接返回“int”和?
问题说明了一切,以下是代码:
public class Chars
{
public static void main(String[] args){
Chars c = new Chars();
String res = c.test("abcd");
System.out.println(res);
}
public String test(String str){
String res = "";
res += str.charAt(0) + str.charAt(2);
return res;
}
}
返回“196”,它是a
和c
的ASCII值之和!
为什么会这样,我希望得到“ac”。
如果我修改test()方法中的第二行,如下所示:
res = res + str.charAt(0)+str.charAt(2);
结果确实是“ac”。 请有人帮我解答这个疑问。我就是找不到答案
# 1 楼答案
不同之处在于串联的构造方式
第一:
res += str.charAt(0) + str.charAt(2);
这里,首先将两个
char
值相加。发生二进制数字升级(JLS, Section 5.6.2)这意味着这些值被提升为
int
,从而创建196
。然后将其添加到str
,并附加"196"
第二:
res = res + str.charAt(0) + str.charAt(2);
这里,首先执行
res + str.charAt(0)
,并且String
加上char
附加char
(通过String Conversion, JLS 15.18.1),产生新的String
然后,类似地附加第二个
char
如果你说
然后结果将与
+=
相同(附加196
)# 2 楼答案
这是因为
charAt()
返回的是字符值,而不是字符串。因此这里的+
运算符并不代表串联,而是两个数字的简单相加如果
+
的两个操作数都是一个数字,则此操作有效。如果其中一个是sString
,+
不再形成加法,但两个操作数都被强制转换为String
,并执行串联。因此,如果在混合中包含res
,则将是一个
String
并且使用相同的逻辑,整个事情也将被评估为
String
# 3 楼答案
JLS §15.18.1. String Concatenation Operator +解释了原因:
在您的情况下,您正在执行:
char + char
。操作数的Non类型为String,因此执行经典的数字加法# 4 楼答案
通常,如果要从字符串中提取字符并获取长度为1的
String
,而不是char
,请使用以下方法代替:您可以这样做:
或者这个:
或:
# 5 楼答案
字符不是字符串。如果“a”和“c”是字符串,则期望得到“ac”。字符是表示字符的无符号整数,如果添加任意两个字符,结果将转换为int。如果要将其视为字符或将其分配给声明为
char
的变量,则必须使用(char)
进行强制转换