“你好,阿米戈!”

“你好,瑞希!”

“你現在對字符串了解得足夠多了,可以學習一些有趣的東西。更具體地說,是一個與 String 類相似但不完全相同的新類。”

“聽起來很有趣,但我並不完全清楚普通字符串的不足之處以及為什麼需要其他類似字符串的類。”

“讓我們從字符串是 Java 中的不可變對像這一事實開始。”

“怎麼樣?我忘記了……或者我從來不知道……”

“讓我提醒你,不可變對像是那些在創建後狀態無法更改的對象。”

“啊……為什麼字符串在 Java 中是不可變的?”

“這樣做是為了使 String 類高度優化並允許它在任何地方使用。例如,僅建議將不可變類型用作 HashMap 集合中的鍵

“然而,當程序員發現 String 類是可變的更方便時,經常會出現這樣的情況。他們想要一個在每次調用其方法之一時都不會創建新子字符串的類。”

“可是它有什麼用呢?”

“好吧,假設我們有一個非常大的字符串,我們需要經常在它的末尾添加一些東西。在這種情況下,即使是字符集合 ( ArrayList<Character>) 也比不斷重新創建和連接 String 對象更有效率。”

“這就是為什麼我們需要不完全是 String 類的字符串?”

” 正是。Java 語言增加了一個類 String 類型,可以改變。它被稱為StringBuilder“。

創建對象

StringBuilder“要基於現有字符串創建對象,您需要執行如下語句:

StringBuilder name = new StringBuilder(string);

“要創建一個空的可變字符串,您需要使用如下語句:

StringBuilder name = new StringBuilder();

方法列表

“該StringBuilder課程有兩打有用的方法。以下是最重要的方法:

方法 描述
StringBuilder append(obj)
將傳遞的對象轉換為字符串並將其附加到當前字符串
StringBuilder insert(int index, obj)
將傳遞的對象轉換為字符串並插入到當前字符串的中間
StringBuilder replace(int start, int end, String str)
用傳遞的字符串替換 start..end 間隔指定的字符串部分
StringBuilder deleteCharAt(int index)
從字符串中刪除具有指定索引的字符
StringBuilder delete(int start, int end)
從字符串中刪除指定間隔內的字符
int indexOf(String str, int index)
在當前字符串中搜索子字符串
int lastIndexOf(String str, int index)
在當前字符串中搜索子字符串,從末尾開始
char charAt(int index)
返回字符串中傳遞的索引處的字符
String substring(int start, int end)
返回指定區間定義的子串
StringBuilder reverse()
反轉當前字符串。
void setCharAt(int index, char)
將指定索引處的字符更改為傳遞的字符
int length()
返回字符串的字符長度

“現在我將向您簡要介紹這些方法中的每一種。

附加到字符串

“要向可變字符串 ( ) 添加內容StringBuilder,請使用該append()方法。示例:

代碼 描述
StringBuilder builder = new StringBuilder("Hi");
builder.append("Bye");
builder.append(123);
Hi
HiBye
HiBye123

轉換為標準字符串

"要將StringBuilder對象轉換為 String 對象,只需調用其toString()方法即可。示例

代碼 輸出
StringBuilder builder = new StringBuilder("Hi");
builder.append(123);
String result = builder.toString();
System.out.println(result);
Hi123

如何刪除角色?

"要刪除可變字符串中的字符,您需要使用該deleteCharAt()方法。示例:

代碼 輸出
StringBuilder builder = new StringBuilder("Hello");
builder.deleteCharAt(2);
String result = builder.toString();
System.out.println(result);
Helo

如何用另一個字符串替換字符串的一部分?

“為此有replace(int begin, int end, String str)方法。示例:

代碼 輸出
StringBuilder builder = new StringBuilder("Mellow");
builder.replace(2, 5, "Hello!");
String result = builder.toString();
System.out.println(result);
MeHello!w

“聽起來很方便。謝謝你,Rishi。”

“別提了,這個怎麼樣,你能把一根繩子倒過來嗎?你會怎麼做?”

“好吧......我會創建一個StringBuilder,在其中放入一個字符串......然後創建一個新字符串,並在從最後一個字符到第一個字符的循環中......或者可能是按位移位......

“不錯。但它可能會更快。有一種特殊的方法可以做到這一點——reverse();示例:

代碼 輸出
String str = "Hello";
StringBuilder builder = new StringBuilder(str);
builder.reverse();
String result = builder.toString();
System.out.println(result);
olleH

“除了StringBuilderclass 之外,Java 還有一個類似字符串的類,叫做StringBuffer. 它是 class 的類似物StringBuilder,但是它的方法用修飾符標記synchronized。”

“這意味著什麼?”

“這意味著StringBuffer可以從多個線程同時訪問該對象。”

“我對線程還不是很熟悉。但是‘可以從多線程訪問’顯然比‘不能從多線程訪問’好……為什麼不總是使用呢?StringBuffer

“因為它比 慢得多。當你開始積極探索Java 多線程StringBuilder任務中的多線程時,你可能需要這樣一個類。

“我會把它寫在我的記憶中,以免忘記。標記為‘為了未來’。