"สวัสดี อามีโก้!"

“สวัสดี ริชิ!”

"ตอนนี้คุณรู้เรื่องสตริงมากพอที่จะเรียนรู้บางสิ่งที่น่าสนใจ โดยเฉพาะอย่างยิ่ง คลาสใหม่ที่คล้ายกัน แต่ไม่เหมือนกับคลาสสตริงทุกประการ"

"ฟังดูน่าสนใจ แม้ว่าจะไม่ชัดเจนนักสำหรับฉันว่าสตริงธรรมดาขาดช่วงไปได้อย่างไร และเหตุใดจึงจำเป็นต้องมีคลาสอื่นๆ ที่มีลักษณะคล้ายสตริง"

"เริ่มจากความจริงที่ว่าสตริงเป็นวัตถุที่ไม่เปลี่ยนรูปแบบใน Java"

"ว่าไงนะ ลืม... หรือไม่เคยรู้มาตั้งแต่แรก..."

"ฉันขอเตือนคุณว่าวัตถุที่ไม่เปลี่ยนรูปคือวัตถุที่ไม่สามารถเปลี่ยนสถานะได้หลังจากสร้างขึ้น"

"อ๊ะ... ทำไมสตริงไม่เปลี่ยนรูปใน Java"

"การดำเนินการนี้ทำขึ้นเพื่อทำให้คลาส String ได้รับการปรับให้เหมาะสมที่สุดและเพื่อให้สามารถใช้งานได้ทุกที่ ตัวอย่างเช่นแนะนำให้ใช้เฉพาะประเภทที่ไม่เปลี่ยนรูปเท่านั้นเพื่อใช้เป็นคีย์ในคอลเล็กชัน HashMap

"อย่างไรก็ตาม สถานการณ์มักจะเกิดขึ้นเมื่อโปรแกรมเมอร์พบว่ามันสะดวกกว่าสำหรับคลาส String ที่จะเปลี่ยนแปลงได้ พวกเขาต้องการคลาสที่ไม่สร้างสตริงย่อยใหม่ทุกครั้งที่เรียกเมธอดใดวิธีการหนึ่ง"

“ว่าแต่อะไรดีล่ะ?”

"สมมติว่าเรามีสตริงขนาดใหญ่มากและเราจำเป็นต้องเพิ่มบางสิ่งที่ส่วนท้ายของสตริงบ่อยๆ ในกรณีนี้ แม้แต่ชุดของอักขระ ( ) ก็สามารถมีประสิทธิภาพมากกว่าการสร้างและต่อออบเจกต์สตริงซ้ำๆ กันArrayList<Character>"

"และนั่นคือเหตุผลที่เราต้องการสตริงที่ไม่ใช่คลาสสตริง"

"ถูกต้องครับ ภาษา 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

"ฟังดูสะดวกดี ขอบคุณ ฤๅษี"

"อย่าพูดถึงมัน แล้วนี่คุณช่วยพลิกเชือกกลับหลังได้ไหม คุณจะทำอย่างไร"

"อืม... ฉันจะสร้าง a StringBuilderใส่สตริงเข้าไป... จากนั้นสร้างสตริงใหม่ และวนซ้ำจากอักขระตัวสุดท้ายไปยังอักขระตัวแรก... หรืออาจจะเลื่อนระดับบิต...

"ไม่เลว แต่อาจเร็วกว่านี้ มีวิธีพิเศษสำหรับการทำสิ่งนี้ — reverse();ตัวอย่าง:

รหัส เอาต์พุต
String str = "Hello";
StringBuilder builder = new StringBuilder(str);
builder.reverse();
String result = builder.toString();
System.out.println(result);
olleH

"นอกจากStringBuilderคลาสแล้ว Java ยังมีคลาสคล้ายสตริงอีกคลาสหนึ่งที่เรียกว่า คลาสStringBufferนี้เป็นแอนะล็อกของStringBuilderคลาส แต่เมธอดของคลาสจะถูกทำเครื่องหมายด้วยsynchronizedตัวดัดแปลง"

"นั่นหมายความว่าอย่างไร?"

"หมายความว่าStringBufferสามารถเข้าถึงวัตถุได้พร้อมกันจากหลาย ๆ เธรด"

"ฉันยังไม่คุ้นเคยกับเธรดมากนัก แต่ 'สามารถเข้าถึงได้จากหลายเธรด' นั้นดีกว่า 'ไม่สามารถเข้าถึงได้จากหลายเธรด' อย่างชัดเจน... ทำไมไม่ใช้ทุกครั้งล่ะStringBuffer"

"เพราะมันช้ากว่ามากStringBuilderคุณอาจต้องการคลาสดังกล่าวเมื่อคุณเริ่มสำรวจมัลติเธรดอย่างแข็งขันในภารกิจJava Multithreading

"ฉันจะเขียนสิ่งนั้นลงในความทรงจำของฉันเพื่อไม่ให้ลืม ทำเครื่องหมายว่า 'สำหรับอนาคต'