Java 通过字符访问数组项的混乱代码段

Java 通过字符访问数组项的混乱代码段,java,arrays,character,Java,Arrays,Character,我在网上找到了这段代码,它返回字符串中最常见的字符。在下面指出的点上,我们有表达式++charcnt[ch]。据我所知,charcnt是一个int[],任何数组的元素都必须通过一个表示特定元素索引号的整数来访问ch是一个字符,但是。。。我运行了代码,没有错误。为什么它不给出一个错误?我知道我们正试图增加计数,但我不明白如何使用字符访问数组。如有任何澄清,将不胜感激 public static char getMax(String word) { if (word == null || w

我在网上找到了这段代码,它返回字符串中最常见的字符。在下面指出的点上,我们有表达式
++charcnt[ch]
。据我所知,charcnt是一个
int[]
,任何数组的元素都必须通过一个表示特定元素索引号的整数来访问
ch
是一个字符,但是。。。我运行了代码,没有错误。为什么它不给出一个错误?我知道我们正试图增加计数,但我不明白如何使用字符访问数组。如有任何澄清,将不胜感激

public static char getMax(String word) {
    if (word == null || word.isEmpty()) {
        throw new IllegalArgumentException("input word must have non-empty value.");
    }
    char maxchar = ' ';
    int maxcnt = 0;
    // if you are confident that your input will be only ascii, then this array can be size 128.
    int[] charcnt = new int[Character.MAX_VALUE + 1];
    for (int i = word.length() - 1; i >= 0; i--) {
        char ch = word.charAt(i);
        // increment this character's cnt and compare it to our max.
        if (++charcnt[ch] >= maxcnt) {    #HERE
            maxcnt = charcnt[ch];
            maxchar = ch;
        }
    }
    return maxchar;
}

当您尝试使用字符访问整数数组时,Java将自动将字符转换为其ASCII值。

来自(emphasis mine

数组必须由int值索引;short、byte或char值也可用作索引值,因为它们受到一元数字提升(§5.6.1)的影响,变成int值


ASCII码有128个不同的字符,其整数值从0到127。
例如,char A的值为65,这意味着它可以用来指向maxcnt的第66个单元格,递增其计数器。

根据java规范

数组必须由int值索引;short、byte或char值可以是 也可用作索引值,因为它们受一元数约束 数字提升(§5.6.1)并成为整数值。试图访问 具有长索引值的数组组件会导致编译时 错误


char可以转换为int。请看一下ASCII表
ch
被提升为
int
在索引建立之前,搜索
char
不仅仅是ASCII。该代码段假设的是ASCII,正如它所说的那样。该代码段没有假设。它表示,如果您的输入仅包含ASCII字符,则可以减少计数器数组的长度。不要困惑。默认情况下,Java使用UTF 8,并且
String
类有一个
char[]
来存储它,所以
char
并不像您在文章中所说的那样仅限于ASCII。我不知道您在哪里读到我在文章中写的“char被限制为ASCII”。顺便说一句,我知道您是对的,但这并不是这个问题的重点,它只是指ASCII