原創文章,轉載請標註出處:https://www.cnblogs.com/V1haoge/p/10755235.html
JDK 6和JDK 7中substring的原理及區別
substring(int beginIndex, int endIndex)方法用於擷取字串,返回擷取的新字串。新字串由當前字串的第beginIndex到endIndex的字元組成,長度無endIndex-beginIndex。
JDK 6中的實現原理
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
//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);// 關鍵就在這裡傳的value,這個value就是字元陣列,新的字串延用value,只是修改了屬性值
}
}
substring方法返回的字串物件時新建立的,但是底層指向的字元陣列並未改變,還指向原字串物件指向的字元陣列,僅僅是使用物件中的三個屬性來限制字元陣列的開始位置與長度,展現給我們的就是擷取完的新字串。
JDK 7中的實現原理
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
//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);
}
}
substring方法返回的字串是新建的,而且底層指向的字元陣列也是新的。