为何遍历字符串操作char[26]数组需用char-'a'而非直接用char?
为什么必须用
chars[string.charAt(i) - 'a']而非chars[string.charAt(i)]? 这个问题问得很关键!咱们来拆解背后的原因:
1. Java中char类型的本质
在Java里,char本质上是一个无符号16位整数,它存储的是字符对应的Unicode码点值。比如小写字母'a'的码点是97,'b'是98,一直到'z'是122。
当你直接写chars[string.charAt(i)]时,相当于用这个字符的码点值(比如97、98...122)作为数组的索引。但咱们定义的数组chars长度只有26,它的合法索引范围是0到25——显然97已经远远超出了这个范围,所以必然会抛出ArrayIndexOutOfBoundsException。
2. -'a'的核心作用
string.charAt(i) - 'a'这个操作的目的,是把小写字母的码点值映射到0-25的范围:
- 当字符是
'a'时,'a' - 'a' = 0,对应数组的第0个位置 - 当字符是
'b'时,'b' - 'a' = 1,对应数组的第1个位置 - ...
- 当字符是
'z'时,'z' - 'a' = 25,对应数组的最后一个位置
因为小写字母的Unicode码点是连续递增的,所以这个减法操作刚好能把每个小写字母对应到数组的合法索引上,完美匹配数组的长度,自然就不会出现越界问题了。
举个直观的例子:
如果字符串里的字符是'c',直接用chars['c']相当于访问chars[99],数组根本没有这么大;而'c' - 'a' = 2,访问chars[2]就是完全合法的。
内容的提问来源于stack exchange,提问作者user9754729
相关产品推荐
相关产品推荐

