我有以下代码
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的String时,我希望返回Stack
但它返回Stac
。
当我查看 substring(int beginIndex,int endIndex)源代码时,它会说明以下内容。
* @param beginIndex the beginning index, inclusive.
* @param endIndex the ending index, exclusive.
有人可以解释在这种情况下包容性和排他性是什么意思吗?为什么它不直观?有没有人知道这种行为的具体原因?
答案 0 :(得分:3)
除非你能在源代码中找到解释(可能)的评论,或找到并询问原作者(极不可能),否则只能猜测出真正的原因。
可以推断出原因是因为Java中的String
和List
等等(以及几乎所有其他语言)都是0索引的(从您的问题来看,您似乎是明白我会跳过解释,但是这些长度的值总是比最终索引的值多一个。还有许多其他例子和实例排除某种“子串”/“子列表”/等的最终索引。功能,因为这样可以很容易地获取字符串/列表/等的长度。并将其作为结束索引传递,然后始终假设它将被排除在子函数的底层实现中,无论其功能如何,以便用户不必总是记得放置-1
或类似的偏移量,如果length用作结束索引。
所以,在你意识到0指数与长度的相互作用之后,它可以说是更直观的。
在this duplicate question的公认答案中有一个很好的解释,它将C带入解释。
答案 1 :(得分:2)
包含表示该索引处的字符包含。
独占表示该索引处的字符将排除。
基本上,它将包含非常字符直到 - 但不包括 - endIndex
。
答案 2 :(得分:1)
包含=包含字符
独家=不包括字符
原因可能是历史惯例,但我不知道我的头脑。
答案 3 :(得分:0)
&#39;直观&#39;是在旁观者的眼中。
当你来写一些行为非常方便的代码时,你会发现。在构造子字符串时,您通常会在其中包含第一个内容的索引,并且:或者
endIndex
只是startIndex+length
或endIndex
的正确值。< / LI>
醇>
第三种情况是当您拥有子字符串中最后一个所需字符的索引时,在这种情况下endIndex
应设置为该值加1.但这只是三个案例中的一个(到目前为止) )。