我在 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?

提问人:Chethan Swaroop 提问时间:2/8/2018 更新时间:4/9/2021 访问量:1696

问:

下面的代码检查是否存在重复的字符

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 ASCII

评论

0赞 tkausl 2/8/2018
没有转换,字符就是数字。

答:

1赞 Sergey Kalinichenko 2/8/2018 #1

Java 使用 16 位 UNICODE 码位*表示 s。没有发生到 ASCII 的转换 - 只是最初的 128 个码位恰好表示与相应 ASCII 值相同的字符。char

Java 确实执行了 to 的转换,以便使索引成为可能。这是一个隐式发生的内置转换,因为它正在扩大。换句话说,任何可以存储在 a 中的值都可以用 an 表示,而不会丢失。charintcharint

*Java-5 改用 UTF-16 表示,将一些数字的解释改为“部分字符”。不过,s 仍然是 16 位无符号数字。char

评论

0赞 jarnbjo 2/8/2018
自 13 年前 Java 5 发布以来,这一直是错误的。
0赞 Sergey Kalinichenko 2/8/2018
@jarnbjo我为此添加了一个脚注,谢谢。但是,它对答案的要点没有影响,因为 OP 的主要混淆是 s 对数组索引的适用性。char
4赞 jarnbjo 2/8/2018 #2

完整的答案比dasblinkenlight所建议的要复杂得多。

从 Java 5 开始,数据类型不再表示字符或 Unicode 代码点,而是表示 UTF-16 编码值,该值可能是完整字符或字符的一部分。这个 UTF-16 值实际上只是一个 0 到 65535 范围内的 16 位无符号整数,当用作数组索引时,将自动转换为 int,就像其他数字数据类型(如 short 或 byte)一样。如果确实需要将 Unicode 代码点作为字符,则应使用该方法而不是 .Unicode 码位可以在 0 到 1114111 (0x10ffff) 的范围内。charcodePointAt(int index)charAt(int index)

这些方法和方法在内部的工作方式是特定于实现的。通常错误地声称 a 只是 s 数组的包装器,但 String 类的内部实现不是语言或 API 规范强制要求的。自 Java 6 以来,Oracle VM 一直在使用不同的优化策略来节省内存,并且并不总是使用普通数组。charAtcodePointAtStringcharchar

评论

0赞 Chethan Swaroop 2/9/2018
所以基本点是,当一个char被用作arrayIndex时,它会自动转换为int,这就是它间接表示字符的ASCII值的方式。我的理解正确吗?
0赞 Tom Blodget 2/9/2018
@ChethanSwaroop 是的,假设您使用 ASCII 作为通用品牌,例如“Kleenex”。请停下来。一般说“字符代码”或具体说“UTF-16 代码单元”会更准确。而且,正如答案所解释的那样,并不总是完整的代码点或“字符”(例如,)。char"🙏".equals("\uD83D\uDE4F")
0赞 Srikanth Janapati 4/9/2021 #3

Java 支持自动加宽基元转换

https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.2

如何阻止 Java 自动将 char 值转换为 int?

char 到 int、long、float 或 double