StringBuilder และ StringBuffer เป็นสองคลาสที่ใช้กันทั่วไปสำหรับการจัดการสตริง อย่างที่เราทราบกันดีว่า StringBuilder เป็นเธรดที่ไม่ปลอดภัยในขณะที่ StringBuffer เป็นเธรดที่ปลอดภัย อดีตถูกเพิ่มโดย JDK1.5 และหลังมีวางจำหน่ายใน JDK1.0 มาวิเคราะห์การใช้งานภายในของพวกเขาด้านล่าง
1. ความสัมพันธ์ในการสืบทอด
ระดับสุดท้ายของคลาสสาธารณะ StringBufferextends AbstractStringBuilderImplements java.io.serializable, charsequencepublic คลาสสุดท้าย stringbuilderextends AbstractStringBuilderImplements java.io.serializable, Charsequence
จะเห็นได้ว่าความสัมพันธ์การสืบทอดระหว่างสองคลาสนั้นเหมือนกัน Serializable เป็นธงอนุกรม อินเทอร์เฟซ Charsequence รวมถึงวิธีการ charat (), ความยาว (), specence () และวิธี toString () คลาสสตริงยังใช้อินเทอร์เฟซนี้ โฟกัสที่นี่อยู่ที่คลาสนามธรรม AbstractStringBuilder ซึ่งสรุปการดำเนินการของการดำเนินงานส่วนใหญ่ของ StringBuilder และ StringBuffer
2. AbstractStringBuilder
1. ตัวแปรและวิธีการก่อสร้าง
char [] value; int count; AbstractStringBuilder () {} AbstractStringBuilder (ความจุ int) {value = new Char [ความจุ];}AbstractStringBuilder ใช้อาร์เรย์ถ่าน [] เพื่อบันทึกสตริงและสามารถระบุวิธีการเริ่มต้นในระหว่างการก่อสร้าง
2. ขยายกำลังการผลิต
โมฆะสาธารณะ ensurecapacity (int minimumcapacity) {ถ้า (ขั้นต่ำสุด> 0) ensurecapacityinternal (ความจุขั้นต่ำ);} โมฆะส่วนตัว ensurecapacityinternal (int ขั้นต่ำสุด) {// // การขยายความจุสูงสุด ขั้นต่ำสุด) {int newCapacity = value.length * 2 + 2; if (newCapacity - minimumCapacity <0) newCapacity = minimumCapacity; if (newCapacity <0) {ถ้า (ขั้นต่ำสุดยอด <0) // ล้นโยน outofMemoryError ใหม่ (); newCapacity = integer.max_value; } value = arrays.copyof (ค่า, newCapacity);}วิธีการขยายจะถูกนำไปใช้ในที่สุดโดย ExpandCapacity () ในวิธีนี้ความจุจะถูกขยายเป็นครั้งแรกไปยังความจุดั้งเดิมบวก 2 หากยังน้อยกว่าความสามารถที่ระบุในเวลานี้ความจุใหม่จะถูกตั้งค่าเป็นขั้นต่ำ จากนั้นตรวจสอบว่ามันล้นหรือไม่ หากมีการไหลล้นให้ตั้งค่าความจุเป็นจำนวนเต็ม max_value ในที่สุดการคัดลอกค่านั้นเห็นได้ชัดว่าเป็นการดำเนินการที่ใช้เวลานาน
3. ผนวก () วิธีการ
Public AbstractStringBuilder ผนวก (String str) {ถ้า (str == null) return uptendNull (); int len = str.length (); ensurecapacityInternal (นับ + len); str.getchars (0, len, ค่า, นับ); นับ += len; คืนสิ่งนี้; -ผนวก () เป็นวิธีที่ใช้กันมากที่สุดมันมีการโอเวอร์โหลดหลายรูปแบบ ข้างต้นเป็นหนึ่งในนั้นซึ่งใช้ในการต่อท้ายสตริง หาก STR เป็น NULL วิธี APPENDNULL () จะถูกเรียก วิธีนี้เพิ่มอักขระเช่น 'n', 'u', 'l' และ 'l' หากไม่ใช่ NULL ก่อนที่จะขยายความจุก่อนจากนั้นเรียกใช้วิธี getChars () ของสตริงเพื่อต่อท้าย Str ไปยังจุดสิ้นสุดของค่า ในที่สุดวัตถุนั้นจะถูกส่งคืนดังนั้นผนวก () สามารถเรียกได้อย่างต่อเนื่อง
3. StringBuilder
AbstractStringBuilder ได้ใช้วิธีการที่ต้องการส่วนใหญ่และจำเป็นต้องเรียกใช้ StringBuilder และ StringBuffer เท่านั้น ลองมาดูการใช้งาน StringBuilder
1. ตัวสร้าง
Public StringBuilder () {super (16);} public StringBuilder (ความจุ int) {super (ความจุ);} public Stringbuilder (String str) {super (str.length () + 16); ผนวก (str);} public StringBuilder (charsequence seq) {this (seq.length () + 16); ผนวก (seq);}ดังที่เห็นได้ว่าขนาดความจุเริ่มต้นของ StringBuilder คือ 16 แน่นอนคุณยังสามารถระบุความจุเริ่มต้นหรือกำหนดค่าเริ่มต้นให้กับวัตถุ StringBuilder ในลำดับอักขระที่มีอยู่
2. ผนวก () วิธีการ
Public StringBuilder ผนวก (String Str) {super.append (str); ส่งคืนสิ่งนี้;} public StringBuilder Supt (Charsequence S) {super.append (s); ส่งคืนสิ่งนี้;}มีวิธีการเกินพิกัดมากมายสำหรับผนวก () และนี่คือสองวิธี เห็นได้ชัดว่านี่คือวิธีการในคลาสหลัก AbstractStringBuilder ที่เรียกว่าโดยตรง
3. ToString ()
สตริงสาธารณะ toString () {// สร้างสำเนาอย่าแชร์อาร์เรย์ส่งคืนสตริงใหม่ (ค่า, 0, นับ);}เมธอด toString () ส่งคืนวัตถุสตริงใหม่ที่ไม่แชร์หน่วยความจำกับวัตถุดั้งเดิม ในความเป็นจริงวิธีเดียวกันเป็นจริงสำหรับวิธี substring () ใน AbstractStringBuilder
4. Sringbuffer
StiringBuffer นั้นคล้ายกับ StringBuilder แต่เพื่อให้ได้การซิงโครไนซ์หลายวิธีใช้การปรับเปลี่ยน LSYNCHRONIZED เช่นวิธีการต่อไปนี้:
ความยาว int ที่ซิงโครไนซ์สาธารณะ () {count return;} public synchronized stringbuffer supt (string str) {toStringCache = null; super.append (str); ส่งคืนสิ่งนี้;} โมฆะที่ซิงโครไนซ์สาธารณะ setLength (int newLength) {toStringCache = null; super.setLength (newLength);} อย่างที่คุณเห็นการซิงโครไนซ์จะถูกเพิ่มเข้ามาในด้านหน้าของวิธีการ
นอกจากนี้ยังมีตัวแปร toStringCache ในเมธอด () และ setLength () ด้านบน ตัวแปรนี้ใช้สำหรับแคชสุดท้ายของวิธี ToString () เมื่อใดก็ตามที่ StringBuffer ได้รับการแก้ไขตัวแปรนี้จะถูกกำหนดให้เป็น NULL ToString ของ StringBuffer มีดังนี้:
สตริงที่ซิงโครไนซ์สาธารณะ toString () {ถ้า (toStringCache == null) {toStringCache = array.CopyOfRange (ค่า, 0, นับ); } ส่งคืนสตริงใหม่ (ToStringCache, true);}ในวิธีนี้หาก ToStringCache เป็นโมฆะมันจะถูกแคชก่อน วัตถุสตริงที่ส่งคืนสุดท้ายนั้นแตกต่างกันเล็กน้อยและตัวสร้างนี้มีพารามิเตอร์จริง ค้นหาซอร์สโค้ดของสตริงและดู:
สตริง (char [] value, boolean share) {// assert share: "ไม่ได้รับการสนับสนุนที่ไม่ได้รับการสนับสนุน"; this.value = value;}ปรากฎว่าวัตถุสตริงที่สร้างขึ้นโดยวิธีการก่อสร้างนี้ไม่ได้คัดลอกสตริงจริง ๆ แต่ชี้ไปที่ค่าไปยังพารามิเตอร์การก่อสร้างซึ่งคือการประหยัดองค์ประกอบการคัดลอกเวลา อย่างไรก็ตามตัวสร้างนี้มีสิทธิ์การเข้าถึงแพ็คเกจและไม่สามารถเรียกได้โดยทั่วไป
สรุป
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้สองคลาสสตริงปฏิบัติการที่ใช้กันทั่วไปใน Java, StringBuilder และ StringBuffer