5

可能重复:
为什么 from index 包含但 end index 是独占的?

substring()方法=>String substring(int beginIndex, int endIndex)

描述:

返回一个新字符串,它是该字符串的子字符串。第一个整数参数指定第一个字符的索引。第二个整数参数是最后一个字符的索引 - 1。

看看下面的代码:

String anotherPalindrome = "Niagara. O roar again!"; 
String roar = anotherPalindrome.substring(11, 15); 

输出:roar

现在,如果 JVM 不减int endIndex一,我们可以直接使用substring(11,14),那不是更方便,更不容易出错(人为方面)吗?endIndex如果你没有仔细阅读描述,当你认为这只是正常的索引时,你可能只是挠了半个小时(就像我一样) 。Java 语言的创造者为什么要把它减一?

4

4 回答 4

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())
于 2012-12-08T21:07:00.690 回答
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是 和 之间的子1115

于 2012-12-08T21:10:37.170 回答
1

这与以下问题相同:

“为什么 Java 中的数组从 0 开始而不是从 1 开始”。

实际上,由于数组从 0 开始,您通常会这样写:

for(int i = 0; i < ar.length; i++)

同样,如果您想要从 start 开始并在 end 结束的子字符串,您将使用类似:

for(int i = start; i < end; i++)
{
    //get ar[i]
}
于 2012-12-08T21:07:34.043 回答
0

substring 似乎经常与 indexOf 方法一起使用。在这些情况下,您可以直接使用找到的索引作为 endIndex 参数将字符串截断为分隔符字符串。例子:

    String text = "filename.ext";

    int pos = text.indexOf(".ext");
    String name = text.substring(0, pos);
    assertEquals("filename", name);

在这些情况下,pos变量已经包含点的索引,并且 substring 可以切断字符串直到点。

于 2012-12-08T21:12:42.333 回答