意外的java charAt输出

时间:2014-06-05 18:08:31

标签: java

代码是

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输出数字而不是字符。我期待它输出字符。我做错了什么?

4 个答案:

答案 0 :(得分:5)

第二行应该是:

e l 8

(请注意,第二个值是小写的L,而不是1),这可能没有违反您的预期。虽然你的变量被称为third,但它是字符串中的第五个字符。

刚离开第三行。表达式的类型

zeroeth + third + length

int ...您正在执行算术加法。没有涉及String的隐式转换,因此,从每个操作数到int的二进制数字促销。它有效:

System.out.println((int) zeroeth + (int) third + (int) length);

它总结了所涉及的UTF-16代码单元' l' l'和8(长度)。

如果您想要涉及字符串转换,那么您可以使用:

System.out.println(String.valueOf(zeroeth) + third + length);

只有第一个添加需要是字符串连接...之后,它会因关联性而流动。 (即x + y + z(x + y) + z;如果x + y的类型为String,则第二次添加也会成为字符串连接。)

答案 1 :(得分:0)

编译器将所有变量解释为值而不是字符串。

尝试System.out.println(“”+ zeroeth + third + length);

答案 2 :(得分:0)

这一行正在进行整数运算:

System.out.println(zeroeth + third + length);

换句话说,它是添加每个字符的unicode值(即e是101,l是108,8是8)。要进行字符串连接,可以在前面添加一个空字符串:

System.out.println("" + zeroeth + third + length);

由于从左到右进行评估,它首先会进行字符串连接(而不是添加)。它将继续这样做第三和长度。最后添加“”将不起作用,因为首先会添加。

答案 3 :(得分:0)

您可以使用包装器类Character的方法来显示char变量的字符串值:

System.out.println(Character.toString(zeroeth) + Character.toString(third) + length);

这样,你总是使用String值,并且不可能显示或添加字符的数值,也不需要连接空字符串(“”)来将char变量转换为字符串值。

相关问题