【String】substring()工作原理及在JDK6和7+

2019-11-19  本文已影响0人  胖三斤66

非原创,参考:灵魂拷问:Java 的 substring() 是如何工作的?

1.substring() 是干嘛的?

函数substring(int beginIndex, int endIndex)
返回:截取给定范围的子串,介于原有字符串的起始下标 beginIndex 和结尾下标 endIndex-1 之间。
示例

String str = "hello world";
String subStr = str.substring(0,5);
System.out.println(subStr) 
/* output:
* hello
*/

2.在JDK6和7+的实现有什么区别?

2.1 在JDK6的实现

源码

String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}
 
public String substring(int beginIndex, int endIndex) {
    //check boundary
    return  new String(offset + beginIndex, endIndex - beginIndex, value);
}

解释:调用 substring() 的时候虽然创建了新的字符串,但字符串的值 value 仍然指向的是内存中的同一个数组,如下图所示。

jdk1.6的substring()实现

2.2 在JDK7+的实现

源码

public String(char value[], int offset, int count) {
    //check boundary
    this.value = Arrays.copyOfRange(value, offset, offset + count);
}
 
public String substring(int beginIndex, int endIndex) {
    //check boundary
    int subLen = endIndex - beginIndex;
    return new String(value, beginIndex, subLen);
}

解释:substring() 通过 new String() 返回了一个新的字符串对象,在创建新的对象时通过 Arrays.copyOfRange() 深度拷贝了一个新的字符数组。如下图所示

jdk7+的substring()实现

2.3 对比

从源码上,JDK6 和 JDK7+ 在于 new String()String 构造函数的区别。

JDK6 的实现

总结:JDK6 的实现可谓“成也萧何,败也萧何”

JDK7+的实现

最后,虽然 JDK6 已经基本没人使用了,但通过它可以去了解常见的内存泄漏的情况,也提醒自己避免出现这种情况。

上一篇下一篇

猜你喜欢

热点阅读