- 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:真正的字符數(shù)組
offset:數(shù)組中的第一個位置索引(從0開始)
count:包含的字符個數(shù)
當調用substring()時,會創(chuàng)建一個新的String數(shù)組凝垛,但是這個string指向堆中同一個字符數(shù)組谨设,兩個對象只有count和offset不同攀甚。
jdk6 substring().png
產生問題:當一個非常長的字符串,每次substring()時只需要很小的一部分蟀瞧,卻會引用整個value[]數(shù)組孤澎,導致大量內存被占用届氢。
JDK 6中,一般用以下方式來解決該問題覆旭。原理:生成一個新的字符串并引用它退子。
x = x.substring(x, y) + ""
-
JDK7 對sunstring()的優(yōu)化
substring()方法在堆內存中創(chuàng)建了另一個字符數(shù)組.
jdk7 substring().png
JDK7substring源碼:
public String(char value[], int offset, int count) {
// value 數(shù)組拷貝
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創(chuàng)建了一個新字符串,避免對老字符串的引用型将。從而解決了內存泄露問題寂祥。