0

我有以下代码

public static void main(String args[]) throws Exception
{
    String mySite = "StackOverflow";
    System.out.println(mySite.substring(0, 4));
}

这个打印是什么Stac 根据我的理解索引从 0 开始。

S<-0
t<-1
a<-2
c<-3
k<-4

当我指定我需要从索引 0 到索引 4 的字符串时,我希望Stack返回但它返回Stac

当我查看substring(int beginIndex, int endIndex)源代码时,它显示以下内容。

 * @param      beginIndex   the beginning index, inclusive.
 * @param      endIndex     the ending index, exclusive.

有人可以解释在这种情况下包容和排斥是什么意思吗?为什么它没有变得更直观?有谁知道这种行为的任何具体原因?

4

4 回答 4

3
  • 包含意味着将包含该索引处的项目。
  • 独占意味着该索引处的项目将包括在内。

真正的原因只能猜测,除非您可以在源代码中找到解释它的注释(可能),或者找到并询问原作者(极不可能)。

可以推断出原因是因为Java(以及几乎所有其他语言)中String的 s 和Lists 等都是 0 索引的(从您的问题来看,您似乎理解了,所以我将跳过解释),但是值这些的长度总是比最终索引的值大一。还有许多其他示例和实例排除某种“子字符串”/“子列表”/等的最终索引。功能,因为这样可以轻松获取字符串/列表/等的长度。并将其作为结束索引传递,然后始终假定它将被排除在子功能的底层实现中,这样-1如果长度用作结束索引。

所以真的,在你意识到 0-index 与长度的交互之后,它可以说是(更)直观。

在这个重复问题的已接受答案中有一个很好的解释,它将 C 带入了解释中。

于 2013-05-23T15:38:01.600 回答
2

包含意味着将包含该索引处的字符。
Exclusive意味着该索引处的字符将被排除

基本上,它将包括非常个性,直到- 但不包括 - endIndex

于 2013-05-23T15:19:43.820 回答
1

包含 = 包含字符

Exclusive = 不包括字符

其原因可能是历史惯例,但我不知道。

于 2013-05-23T15:19:41.903 回答
0

“直觉”在旁观者的眼中。

当您开始编写一些代码时,您会发现该行为非常方便。构造子字符串时,您通常具有其中的第一件事的索引,并且:

  1. 所需的长度,在这种情况下endIndexstartIndex+length,或
  2. 不在所需子字符串中的第一个字符的索引,例如分隔符,在这种情况下,它已经是 . 的正确值endIndex

第三种情况是当您拥有子字符串中最后一个所需字符的索引时,在这种情况下endIndex应设置为该值加 1。但这只是三分之一的情况(到目前为止)。

于 2013-05-24T01:57:43.900 回答