繁体   English   中英

意外的java charAt输出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM