[英]Unexpected java charAt output
该代码是
String veggie = "eggplant";
int length = veggie.length();
char zeroeth = veggie.charAt(0);
char third = veggie.charAt(4);
String caps = veggie.toUpperCase();
System.out.println(veggie + " " + caps);
System.out.println(zeroeth + " " + third + " " + length);
System.out.println(zeroeth + third + length);
输出为:
eggplant EGGPLANT
e 1 8
217
这对我来说没有意义。 引用charAt输出数字而不是字符。 我期望它输出字符。 我做错了什么?
第二行实际上应该是:
e l 8
(请注意,第二个值是小写的L,而不是1),这可能不会违反您的期望。 尽管您的变量尽管是字符串中的第五个字符,但仍被混淆地称为“ third
”。
那只剩下第三行。 表达式的类型
zeroeth + third + length
是int
...您正在执行算术加法。 没有涉及到String
的隐式转换,因此,从每个操作数到int
都有二进制数值提升。 有效的是:
System.out.println((int) zeroeth + (int) third + (int) length);
它是对涉及'e','l'和8(长度)的UTF-16代码单元求和。
如果要涉及字符串转换,则可以使用:
System.out.println(String.valueOf(zeroeth) + third + length);
只有第一个加法项需要为字符串连接...之后,由于关联性,它会流动。 (即x + y + z
为(x + y) + z
;如果x + y
的类型为String
,则第二个加法也将成为字符串可乘积。)
编译器将所有变量解释为值而不是字符串。
尝试System.out.println(“” + zeroeth +第三+长度);
该行正在执行整数运算:
System.out.println(zeroeth + third + length);
换句话说,它将每个字符的unicode值相加(即e为101,l为108,8为8)。 要进行字符串连接,可以在前面添加一个空字符串:
System.out.println("" + zeroeth + third + length);
由于它是从左到右求值的,因此它将首先进行String连接(而不是加法)。 它将继续这样做并持续第三次。 在末尾添加“”将不起作用,因为首先会发生添加。
您可以使用包装器类Character的方法来显示char变量的字符串值:
System.out.println(Character.toString(zeroeth) + Character.toString(third) + length);
这样,您将始终使用String值,并且无法显示或添加char的数值,并且无需将空字符串(“”)串联即可将char变量转换为String值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.