可能重复:
why from index is inclusive but end index is exclusive?
substring()
method => String substring(int beginIndex, int endIndex)
说明
返回一个新字符串,该字符串是此字符串的子字符串。首先 integer参数指定第一个字符的索引。该 第二个整数参数是最后一个字符的索引 - 1。
看看以下代码:
String anotherPalindrome = "Niagara. O roar again!";
String roar = anotherPalindrome.substring(11, 15);
输出:roar
现在,如果JVM没有将int endIndex
减去一个,我们可以使用substring(11,14)
代替,这样会不会更方便,更不容易出错(人性化的一面)?如果您没有仔细阅读说明,当您认为endIndex
只是正常索引时,您可能只是半个小时(就像我做的那样)挠头。 Java语言创建者将其减去一个的原因是什么?
答案 0 :(得分:7)
它有几个优点:
s.substring(0, s.length())
总是正确的。也:
s.substring(i, j)
结果字符串的大小始终为j - i
。更具体地说,s.substring(0, j)
将始终返回j
个字符。最后,这意味着如果您想在索引n
之后获取i
个字符,您只需说:
s.substring(i, i + n)
提取字符串的后缀(最后n
个字符)也更容易:
s.substring(s.length() - n, s.length())
例如提取文件扩展名:
s.substring(s.indexOf('.') + 1, s.length())
答案 1 :(得分:3)
把它想象为字母之间的间隙,而不是字母本身:
N i a g a r a . _ O _ r o a r _ a g a i n !
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
显然,roar
是11
和15
之间的子字符串。
答案 2 :(得分:1)
这是同样的问题:
“为什么Java中的数组从0开始而不是1”。
的确,由于数组从0开始,你通常会写:
for(int i = 0; i < ar.length; i++)
同样,如果你想要一个从开始到结尾的子字符串,你可以使用类似的东西:
for(int i = start; i < end; i++)
{
//get ar[i]
}
答案 3 :(得分:0)
substring似乎经常与indexOf方法一起使用。在这些情况下,您可以直接使用找到的索引作为endIndex参数来将字符串切断为分隔符字符串。例如:
String text = "filename.ext";
int pos = text.indexOf(".ext");
String name = text.substring(0, pos);
assertEquals("filename", name);
在这些情况下,pos
变量已包含点的索引,子字符串可以将字符串切断为点。