(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); }
(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; }
(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; }
(4)toString方法返回的是一個新的String對象嗎?
這個不是的,該方法返回的就是自身。

public String toString() { return this; }
(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; }