乐趣区

关于javascript:注意字符串substring方法在jkd678中的差异

题目中的 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

退出移动版