题目中的 substring 办法指的是字符串的 substring(int beginIndex, int endIndex)办法,这个办法在 jdk6,7 是有差别的。
substring 有什么用?
substring 返回的是字符串索引地位 beginIndex 开始,endIndex- 1 完结的字符串。
来看这个例子:
String x = “abcdef”;
x = x.substring(1,3);
System.out.println(x);
输入:
bc
上面看看在 JDK 之间,它们的实现原理有什么不一样,及值得注意的中央。
JDK 6
String 背地是由 char 数组形成的,在 JDK6 中,String 蕴含三个字段:char value[], int offset, int count,意思很简略。
substring 被调用时,它会创立一个新的字符串,但字符串的值还指向堆中同样的字符数组。它们的区别只是数量和下标援用不一样,如图所示。
JDK6 中的局部源码能够阐明这个问题。
//JDK 6
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(),你只须要很小的一部分。这将会导致性能问题,因为只须要一小部分,却援用了整个字符数组内容。对于 JDK 6,解决方案是应用以下内容:
x = x.substring(x, y) + “”
JDK 7,8
JDK6 这种问题在 JDK7+ 中曾经改善了,JDK7+ 中理论是从新创立了一个字符数组,如图。
JDK7 中的局部源码,JDK8 相似。
//JDK 7
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);
}
对于 JDK 的这种差别,咱们晓得就好,当初应该都是 JDK7 及 8 了吧,其实对于小字符串的这种操作性能也是能够忽略不计的。
最初
如果你感觉此文对你有一丁点帮忙,点个赞。或者能够退出我的开发交换群:1025263163 互相学习,咱们会有业余的技术答疑解惑
如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点 star: https://gitee.com/ZhongBangKe… 不胜感激!
JAVA 学习手册:https://doc.crmeb.com
技术交换论坛:https://q.crmeb.com