String中各方法多數情況下返回新的String對象


(1)subString是否始終返回一個新串?

  事實並非如此,subString只有在截取的子串是真子串(真子串指子串與原串不相同)時才會返回一個新聲明的子串。當截取的是整個字符串時,則返回自身,具體可參考源碼:

  subString方法用來截取子串,方法的使用有兩種形式String subString(int begin)和String subString(int begin, int end)。具體可參考JDK文檔。

public String substring(int beginIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        int subLen = value.length - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
    }

    public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
    }
View Code

(2)replace方法是否始終返回一個新串?

  在一般情況下是這樣,但如果要替代的字符與新字符一樣的話,則返回自身:

public String replace(char oldChar, char newChar) {
        if (oldChar != newChar) {
            int len = value.length;
            int i = -1;
            char[] val = value; /* avoid getfield opcode */

            while (++i < len) {
                if (val[i] == oldChar) {
                    break;
                }
            }
            if (i < len) {
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) {
                    buf[j] = val[j];
                }
                while (i < len) {
                    char c = val[i];
                    buf[i] = (c == oldChar) ? newChar : c;
                    i++;
                }
                return new String(buf, true);
            }
        }
        return this;
    }
View Code

(3)toCharArray方法返回String對象內置的字符數組?

  並不是這樣,方法返回的是一個嶄新的字符數組,且空間分配在堆空間。所以對該方法返回的字符數組進行修改,不會對String對象產生任何影響。

public char[] toCharArray() {
        // Cannot use Arrays.copyOf because of class initialization order issues
        char result[] = new char[value.length];
        System.arraycopy(value, 0, result, 0, value.length);
        return result;
    }
View Code

(4)toString方法返回的是一個新的String對象嗎?

  這個不是的,該方法返回的就是自身。

public String toString() {
        return this;
    }
View Code

 (5)trim方法始終返回一個新的String對象嗎?

  並不總是這樣,首先trim方法是返回String對象的一個副本,該副本去除了原來字符串中的首部和尾部空白。但如果String對象首部和尾部沒有空白的話,則返回自身。否則調用subString方法返回一個嶄新的String對象(真子串,subString方法中說過)。

public String trim() {
        int len = value.length;
        int st = 0;
        char[] val = value;    /* avoid getfield opcode */

        while ((st < len) && (val[st] <= ' ')) {
            st++;
        }
        while ((st < len) && (val[len - 1] <= ' ')) {
            len--;
        }
        return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
    }
View Code

 


免責聲明!

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



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