"สวัสดี อามีโก้!"
“สวัสดี ริชิ!”
"ตอนนี้คุณรู้เรื่องสตริงมากพอที่จะเรียนรู้บางสิ่งที่น่าสนใจ โดยเฉพาะอย่างยิ่ง คลาสใหม่ที่คล้ายกัน แต่ไม่เหมือนกับคลาสสตริงทุกประการ"
"ฟังดูน่าสนใจ แม้ว่าจะไม่ชัดเจนนักสำหรับฉันว่าสตริงธรรมดาขาดช่วงไปได้อย่างไร และเหตุใดจึงจำเป็นต้องมีคลาสอื่นๆ ที่มีลักษณะคล้ายสตริง"
"เริ่มจากความจริงที่ว่าสตริงเป็นวัตถุที่ไม่เปลี่ยนรูปแบบใน Java"
"ว่าไงนะ ลืม... หรือไม่เคยรู้มาตั้งแต่แรก..."
"ฉันขอเตือนคุณว่าวัตถุที่ไม่เปลี่ยนรูปคือวัตถุที่ไม่สามารถเปลี่ยนสถานะได้หลังจากสร้างขึ้น"
"อ๊ะ... ทำไมสตริงไม่เปลี่ยนรูปใน Java"
"การดำเนินการนี้ทำขึ้นเพื่อทำให้คลาส String ได้รับการปรับให้เหมาะสมที่สุดและเพื่อให้สามารถใช้งานได้ทุกที่ ตัวอย่างเช่นแนะนำให้ใช้เฉพาะประเภทที่ไม่เปลี่ยนรูปเท่านั้นเพื่อใช้เป็นคีย์ในคอลเล็กชัน HashMap
"อย่างไรก็ตาม สถานการณ์มักจะเกิดขึ้นเมื่อโปรแกรมเมอร์พบว่ามันสะดวกกว่าสำหรับคลาส String ที่จะเปลี่ยนแปลงได้ พวกเขาต้องการคลาสที่ไม่สร้างสตริงย่อยใหม่ทุกครั้งที่เรียกเมธอดใดวิธีการหนึ่ง"
“ว่าแต่อะไรดีล่ะ?”
"สมมติว่าเรามีสตริงขนาดใหญ่มากและเราจำเป็นต้องเพิ่มบางสิ่งที่ส่วนท้ายของสตริงบ่อยๆ ในกรณีนี้ แม้แต่ชุดของอักขระ ( ) ก็สามารถมีประสิทธิภาพมากกว่าการสร้างและต่อออบเจกต์สตริงซ้ำๆ กันArrayList<Character>
"
"และนั่นคือเหตุผลที่เราต้องการสตริงที่ไม่ใช่คลาสสตริง"
"ถูกต้องครับ ภาษา Java ได้เพิ่มประเภทที่เหมือน String ที่สามารถเปลี่ยนแปลงได้ เรียกว่าStringBuilder
"
การสร้างวัตถุ
"ในการสร้างStringBuilder
วัตถุตามสตริงที่มีอยู่ คุณต้องใช้คำสั่งเช่น:
StringBuilder name = new StringBuilder(string);
"ในการสร้างสตริงที่ไม่แน่นอนที่ว่างเปล่า คุณต้องใช้คำสั่งดังนี้:
StringBuilder name = new StringBuilder();
รายการวิธีการ
" StringBuilder
ชั้นเรียนมีวิธีที่เป็นประโยชน์สองโหล วิธีที่สำคัญที่สุดมีดังนี้
วิธี | คำอธิบาย |
---|---|
|
แปลงออบเจกต์ที่ผ่านเป็นสตริงแล้วผนวกเข้ากับสตริงปัจจุบัน |
|
แปลงอ็อบเจกต์ที่ผ่านเป็นสตริงและแทรกที่กึ่งกลางของสตริงปัจจุบัน |
|
แทนที่ส่วนของสตริงที่ระบุโดยช่วง start..end ด้วยสตริงที่ผ่าน |
|
ลบอักขระที่มีดัชนีที่ระบุออกจากสตริง |
|
ลบอักขระภายในช่วงเวลาที่กำหนดออกจากสตริง |
|
ค้นหาสตริงย่อยในสตริงปัจจุบัน |
|
ค้นหาสตริงย่อยในสตริงปัจจุบัน โดยเริ่มจากจุดสิ้นสุด |
|
ส่งกลับอักขระในสตริงที่ดัชนีที่ผ่าน |
|
ส่งกลับสตริงย่อยที่กำหนดโดยช่วงเวลาที่ระบุ |
|
ย้อนกลับสตริงปัจจุบัน |
|
เปลี่ยนอักขระที่ดัชนีที่ระบุเป็นอักขระที่ผ่าน |
|
ส่งกลับความยาวของสตริงเป็นตัวอักษร |
"และตอนนี้ฉันจะอธิบายวิธีการเหล่านี้ให้คุณฟังโดยสังเขป
ต่อท้ายสตริง
"หากต้องการเพิ่มบางสิ่งในสตริงที่ไม่แน่นอน ( StringBuilder
) ให้ใช้append()
วิธีการ ตัวอย่าง:
รหัส | คำอธิบาย |
---|---|
|
Hi |
แปลงเป็นสตริงมาตรฐาน
"ในการแปลงStringBuilder
ออบเจกต์เป็นออบเจกต์ String คุณต้องเรียกtoString()
เมธอดของมัน ตัวอย่าง
รหัส | เอาต์พุต |
---|---|
|
Hi123 |
ฉันจะลบตัวละครได้อย่างไร?
"หากต้องการลบอักขระในสตริงที่ไม่แน่นอน คุณต้องใช้deleteCharAt()
วิธีการ ตัวอย่าง:
รหัส | เอาต์พุต |
---|---|
|
Helo |
ฉันจะแทนที่ส่วนหนึ่งของสตริงด้วยสตริงอื่นได้อย่างไร
"สำหรับสิ่งนี้มีreplace(int begin, int end, String str)
วิธีการ ตัวอย่าง:
รหัส | เอาต์พุต |
---|---|
|
MeHello |
"ฟังดูสะดวกดี ขอบคุณ ฤๅษี"
"อย่าพูดถึงมัน แล้วนี่คุณช่วยพลิกเชือกกลับหลังได้ไหม คุณจะทำอย่างไร"
"อืม... ฉันจะสร้าง a StringBuilder
ใส่สตริงเข้าไป... จากนั้นสร้างสตริงใหม่ และวนซ้ำจากอักขระตัวสุดท้ายไปยังอักขระตัวแรก... หรืออาจจะเลื่อนระดับบิต...
"ไม่เลว แต่อาจเร็วกว่านี้ มีวิธีพิเศษสำหรับการทำสิ่งนี้ — reverse();
ตัวอย่าง:
รหัส | เอาต์พุต |
---|---|
|
olleH |
"นอกจากStringBuilder
คลาสแล้ว Java ยังมีคลาสคล้ายสตริงอีกคลาสหนึ่งที่เรียกว่า คลาสStringBuffer
นี้เป็นแอนะล็อกของStringBuilder
คลาส แต่เมธอดของคลาสจะถูกทำเครื่องหมายด้วยsynchronized
ตัวดัดแปลง"
"นั่นหมายความว่าอย่างไร?"
"หมายความว่าStringBuffer
สามารถเข้าถึงวัตถุได้พร้อมกันจากหลาย ๆ เธรด"
"ฉันยังไม่คุ้นเคยกับเธรดมากนัก แต่ 'สามารถเข้าถึงได้จากหลายเธรด' นั้นดีกว่า 'ไม่สามารถเข้าถึงได้จากหลายเธรด' อย่างชัดเจน... ทำไมไม่ใช้ทุกครั้งล่ะStringBuffer
"
"เพราะมันช้ากว่ามากStringBuilder
คุณอาจต้องการคลาสดังกล่าวเมื่อคุณเริ่มสำรวจมัลติเธรดอย่างแข็งขันในภารกิจJava Multithreading
"ฉันจะเขียนสิ่งนั้นลงในความทรงจำของฉันเพื่อไม่ให้ลืม ทำเครื่องหมายว่า 'สำหรับอนาคต'