字符串內部工作原理和子字符串方法 -​​ 1

“嗨,阿米戈!”

“嗨,艾莉。”

“我要告訴你有關子字符串的知識。子字符串是字符串的一部分。對字符串執行的最常見操作(將多個字符串組合在一起後)是獲取子字符串。”

7) 如何獲取字符串的一部分?

“子字符串方法返回字符串的一部分。此方法有兩個版本。”

“第一個版本返回由起始索引和結束索引指定的子字符串。但不包括結束索引處的字符!如果傳遞數字 1 和 3,則子字符串將僅包含第二個和第三個字符(記住索引開始0)。”

“第二個版本返回從傳遞的索引開始直到字符串結尾的子字符串。”

方法) 例子)
String substring(int beginIndex, int endIndex)
String s = "Good news, everyone!";
s = s.substring(1,6);
結果:

s == "ood n";
String substring(int beginIndex)
String s = "Good news, everyone!";
s = s.substring(1);

“這很簡單。謝謝,艾莉。”

“我還將向您解釋 String 對象的內部工作原理。”

“正如您可能已經知道的那樣,String 是一個不可變的類。這給我們帶來了哪些優勢?碰巧的是,其中一個關鍵優勢是能夠獲取子字符串。但首先要做的是。”

“在內部,一個 String 對象包含一個字符數組,這並不難猜。但它還存儲了兩個變量:數組中第一個字符的索引和字符數。現在我告訴你這些是什麼用於。”

“當我們使用 substring方法創建子字符串時,會創建一個新的String對象。”

“但是,該對像不是存儲對新字符數組的引用,而是存儲對舊數組的引用以及它用來確定與其關聯的原始字符數組部分的兩個變量。”

“我一點都不明白。”

“創建子字符串時,字符數組不會復製到新的 String 對象。相反,兩個對像都存儲對原始字符數組的引用。但是!第二個對像還存儲兩個變量:它在數組中的起始索引和屬於子字符串的字符數。”

“一探究竟:”

獲取子串 子字符串中存儲了什麼
String s = "mama";
s中存儲了什麼:

char[] value = {'m','a','m','a'};
offset = 0;
count = 4;
String s2 = s.substring(1);
s2 中存儲的內容:

char[] value = {'m','a','m','a'};
offset = 1;
count = 3;
String s3 = s.substring(1, 3);
s3 中存儲的內容:

char[] value = {'m','a','m','a'};
offset = 1;
count = 2;

“所有三個字符串都存儲對同一個字符數組的引用,但它們還存儲與其相關的第一個和最後一個字符的索引。或者更準確地說,第一個字符的索引和字符數。”

“現在說得通了。”

“因此,如果您使用一個 10,000 個字符長的字符串並創建 10,000 個任意長度的子字符串,這些子字符串將使用非常少的內存,因為字符數組沒有重複。這些字符串,您預計會用掉很多的空間,實際上只需要幾個字節。”

“涼爽的!”

“但是如果你可以修改字符串,你能做到嗎?”

“不,有人可以改變第一個字符串,然後它的所有子字符串也會改變。現在他們這樣做的原因是有道理的。這是一個非常酷的解決方案。”

“我很高興你喜歡它。”