Java基礎系列-substring的原理


原創文章,轉載請標注出處: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方法返回的字符串是新建的,而且底層指向的字符數組也是新的。

圖片來自網絡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM