JDK6和JDK7 String.substring()区别
2022-07-15 本文已影响0人
糯米团子123
- substring(int beginIndex,int endIndex) 返回此对象的一个子串,从beginIndex开始到endIndex结束。
- JDK6中的substring()
先来看一下源码:
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
public String substring(int beginIndex, int endIndex) {
return new String(offset + beginIndex, endIndex - beginIndex, value);
}
String类包含三个成员变量:char value[], int offset,int count。
value:真正的字符数组
offset:数组中的第一个位置索引(从0开始)
count:包含的字符个数
当调用substring()时,会创建一个新的String数组,但是这个string指向堆中同一个字符数组,两个对象只有count和offset不同。
产生问题:当一个非常长的字符串,每次substring()时只需要很小的一部分,却会引用整个value[]数组,导致大量内存被占用。
JDK 6中,一般用以下方式来解决该问题。原理:生成一个新的字符串并引用它。
x = x.substring(x, y) + ""
-
JDK7 对sunstring()的优化
substring()方法在堆内存中创建了另一个字符数组.
jdk7 substring().png
JDK7substring源码:
public String(char value[], int offset, int count) {
// value 数组拷贝
this.value = Arrays.copyOfRange(value, offset, offset + count);
}
public String substring(int beginIndex, int endIndex) {
int subLen = endIndex - beginIndex;
return new String(value, beginIndex, subLen);
}
使用new String创建了一个新字符串,避免对老字符串的引用。从而解决了内存泄露问题。