You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何遍历字符串操作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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:46:38