提问人:Chethan Swaroop 提问时间:2/8/2018 更新时间:4/9/2021 访问量:1696
我在 Java 中使用了 char 变量作为布尔数组的数组索引?字符到其 ASCII 值的转换是如何发生的?
I used a char variable as Array Index to a Boolean array in Java? How does the conversion of character to its ASCII value happen?
问:
下面的代码检查是否存在重复的字符
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.
}
答:
Java 使用 16 位 UNICODE 码位*表示 s。没有发生到 ASCII 的转换 - 只是最初的 128 个码位恰好表示与相应 ASCII 值相同的字符。char
Java 确实执行了 to 的转换,以便使索引成为可能。这是一个隐式发生的内置转换,因为它正在扩大。换句话说,任何可以存储在 a 中的值都可以用 an 表示,而不会丢失。char
int
char
int
*Java-5 改用 UTF-16 表示,将一些数字的解释改为“部分字符”。不过,s 仍然是 16 位无符号数字。char
评论
char
完整的答案比dasblinkenlight所建议的要复杂得多。
从 Java 5 开始,数据类型不再表示字符或 Unicode 代码点,而是表示 UTF-16 编码值,该值可能是完整字符或字符的一部分。这个 UTF-16 值实际上只是一个 0 到 65535 范围内的 16 位无符号整数,当用作数组索引时,将自动转换为 int,就像其他数字数据类型(如 short 或 byte)一样。如果确实需要将 Unicode 代码点作为字符,则应使用该方法而不是 .Unicode 码位可以在 0 到 1114111 (0x10ffff) 的范围内。char
codePointAt(int index)
charAt(int index)
这些方法和方法在内部的工作方式是特定于实现的。通常错误地声称 a 只是 s 数组的包装器,但 String 类的内部实现不是语言或 API 规范强制要求的。自 Java 6 以来,Oracle VM 一直在使用不同的优化策略来节省内存,并且并不总是使用普通数组。charAt
codePointAt
String
char
char
评论
char
"🙏".equals("\uD83D\uDE4F")
Java 支持自动加宽基元转换
https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.2
char 到 int、long、float 或 double
评论