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

Java统计两字符串同位置2长度子串时for循环i<length-1的原因

问题原理说明

第一步:先明确Javasubstring方法的取值规则

Java中String.substring(int beginIndex, int endIndex)的参数规则是固定的:

  • beginIndex是子串的起始下标,包含对应位置的字符
  • endIndex是子串的结束下标,不包含对应位置的字符
  • 两个参数必须满足 0 ≤ beginIndex ≤ endIndex ≤ 字符串总长度,否则会直接抛出索引越界异常。

第二步:推导长度为2的子串的起始下标范围

你要截取的是长度为2的子串,也就是endIndex - beginIndex = 2,代入你写的substring(i, i+2)刚好满足长度要求。
假设当前字符串总长度为len,那必须满足i+2 ≤ len才能符合substring的参数要求,把不等式变形可得:
i ≤ len - 2
因为循环变量i是从0开始的整数,所以i的合法取值范围是0 ≤ i ≤ len-2,转换成for循环的判断条件,就可以写成i < len -1,两者是完全等价的:比如len=4的时候,len-1=3,i<3的话i最大取2,刚好等于4-2=2,符合要求。

实际例子验证

比如有个字符串是"test",总长度是4:

  • 合法的长度为2的子串起始下标只能是0、1、2,对应子串是"te"、"es"、"st"
  • 如果循环条件不加-1写成i < a.length(),那i会取到3,这时候调用substring(3,5),而字符串总长度只有4,5>4,直接触发索引越界异常,程序崩溃。

你代码里的循环上限取的是两个字符串里更短的那个的长度减1,就是为了保证不管是取a还是b的子串,都不会超出各自的索引范围,同时能遍历完所有可能的长度为2的等起始位置的子串。

内容的提问来源于stack exchange,提问作者swiftkeys6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:54:01