当前位置: 代码迷 >> 综合 >> String类的substring(int beginIndex)方法
  详细解决方案

String类的substring(int beginIndex)方法

热度:30   发布时间:2023-09-22 05:55:37.0

今天在刷一个视频的时候看到这个方法突然想的一些内容。

1、该方法的作用以及实现?

该方法的作用是从beginIndex开始到字符串结束取字符串的子串。beginIndex位置(索引从0开始)的字符是包含在子串中的。实现方法是重新new一个字符串对象并返回(这并不是代表原字符串被取代)。Java中的String底层还是字符串数组,所以怎么去截取就很简单了。jdk源码如下:

return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);

可以看到设计者很节省时间,如果beginIndex为0,直接返回this。value代表字符串底层的字符数组,beginIndex代表开始下标(被包含),subLen代表子串的长度。

2、beginIndex的取值范围?

首先经过上面的分析,可以肯定beginIndex作为索引肯定是不能小于0的。那么能不能等于该字符串的长度呢?上源码:

if (beginIndex < 0) {throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {throw new StringIndexOutOfBoundsException(subLen);
}

第一个if已经分析了。然后下面的subLen=字符串长度-beginIndex,subLen小于0代表beginIndex大于字符串的长度,subLen大于等于0都可以。那么就代表beginIndex可以等于字符串长度。当它正好等于字符串长度时,会执行以下源代码:

if (count <= 0) {if (count < 0) {throw new StringIndexOutOfBoundsException(count);}if (offset <= value.length) {this.value = "".value;return;}
}

count就是上面提到的subLen,因此count=0,offset就是上面提到的beginIndex,value还是那个value。所以返回的是个“”。

开始我也很好奇为什么beginIndex可以与字符数组长度相同,因为array[array.length]果断是ArrayIndexOutOfBoundsException,这里可以这么说服自己,C语言中字符串末尾都有个'\0',java中自然也效仿了一下,用“”致敬了一波。。。

更深层次的意义希望有大佬来教教我???

最后,看源码其实很有趣。

  相关解决方案