我在Java中使用了一个char变量作为布尔数组的数组索引?如何将字符转换为ASCII值?
下面的代码检查是否存在重复字符
String s = "Bengaluru";
boolean[] characters = new boolean[128];
for(int i=0; i<s.length();i++){
char ch = s.charAt(i);
if(characters[ch] == true){
return;
}
else
characters[ch] = true;//Here true is getting stored in the ASCII value of the character.
}
# 1 楼答案
完整的答案比dasblinkenlight所暗示的要复杂得多
自Java 5以来,数据类型
char
不再表示字符或Unicode码点,而是表示UTF-16编码值,它可能是完整字符或字符的一小部分。这个UTF-16值实际上只是一个介于0到65535之间的16位无符号整数,当用作数组索引时,它将自动转换为int,就像short或byte等其他数字数据类型一样。如果确实希望Unicode码点作为字符,则应使用方法codePointAt(int index)
而不是charAt(int index)
。Unicode代码点可以在0到1114111(0x10ffff)之间方法
charAt
和codePointAt
方法的内部工作方式是特定于实现的。人们常常错误地认为String
只是char
数组的包装器,但该语言或API规范并不强制要求字符串类的内部实现。自Java6以来,Oracle VM一直在使用不同的优化策略来节省内存,并且并不总是使用普通的char
数组# 2 楼答案
Java使用16位UNICODE代码点表示
char
。没有发生到ASCII的转换-只是初始128个代码点恰好表示与相应ASCII值相同的字符Java确实执行了
char
到int
的转换,以使索引成为可能。这是一个隐式发生的内置转换,因为它是加宽。换句话说,可以存储在char
中的任何值都可以在int
中表示,而不会丢失*Java-5切换到UTF-16表示,将一些数字的解释更改为“部分字符”
char
仍然是16位无符号数# 3 楼答案
Java支持自动加宽原语转换
https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.2
How to stop Java from automatically casting a char value to an int?
字符到int、long、float或double