เนื่องจากเมื่อดูที่ซอร์สโค้ดของ StringBuffer และ StringBuilder พบว่าทั้งคู่สืบทอด AbstractStringBuilder และวิธีการหลายวิธีเป็นวิธีการของคลาส Parent AbstractStringBuilder โดยตรงดังนั้นฉันจึงตัดสินใจดูซอร์สโค้ดของ AbstractStringBuilder ก่อน
สถานที่: ในแพ็คเกจ java.lang
คำสั่ง: คลาสนามธรรม AbstractStringBuilderImplements ต่อท้าย, Charsequence
คลาส AbstractStringBuilder มีการปรับเปลี่ยนนามธรรมซึ่งแสดงให้เห็นว่าไม่สามารถสร้างอินสแตนซ์ได้
คลาส AbstractStringBuilder มีสองคลาสย่อย: StringBuilder และ StringBuffer
ทุ่งนา
/*** ค่าใช้สำหรับการจัดเก็บอักขระ */ ค่าถ่าน []; /*** จำนวนคือจำนวนอักขระที่ใช้ */ int count;
ตัวสร้าง
1. ตัวสร้างพารามิเตอร์
AbstractStringBuilder () {}2. เมื่อสร้างวัตถุของคลาสการใช้งาน AbstractStringBuilder ให้ระบุขนาดของบัฟเฟอร์เพื่อความจุ
AbstractStringBuilder (ความจุ int) {value = char ใหม่ [ความจุ]; -เมื่อ subclass stringbuilder หรือ stringbuffer เป็นอินสแตนซ์ตัวสร้างนี้จะถูกเรียกในตัวสร้าง
ขยายกำลังการผลิต
void expandCapacity(int minimumCapacity)
วิธีนี้มีสิทธิ์การเข้าถึงแพ็คเกจและหลายวิธีในชั้นเรียนจะเรียกวิธีนี้เพื่อขยายความจุเมื่อความจุไม่เพียงพอ
ซอร์สโค้ด:
เป็นโมฆะ ExpandCapacity (int minimumCapacity) {int newCapacity = (value.length + 1) * 2; if (newCapacity <0) {newCapacity = integer.max_value; } อื่นถ้า (minimumCapacity> newCapacity) {newCapacity = minimumCapacity; } value = array.copyof (ค่า, newCapacity); -เพิ่มความยาวบัฟเฟอร์ 1 คูณ 2 ลงในตัวแปร newcapacity จากนั้นเปรียบเทียบค่านี้กับค่าที่ระบุและกำหนดค่าที่ใหญ่กว่าเป็นกำลังการผลิตใหม่ของบัฟเฟอร์ จากนั้นเรียกใช้เมธอด copyof ของคลาสอาร์เรย์ซึ่งสร้างอาร์เรย์ใหม่จากนั้นคัดลอกอักขระทั้งหมดในอาร์เรย์ดั้งเดิมลงในอาร์เรย์ใหม่
ensureCapacity (int minimumcapacity)
โมฆะสาธารณะ ensurecapacity (int minimumcapacity)
ตรวจสอบให้แน่ใจว่าความจุอย่างน้อยเท่ากับค่าต่ำสุดที่ระบุ หากกำลังการผลิตปัจจุบันน้อยกว่าค่าที่ระบุอาร์เรย์ใหม่จะถูกสร้างขึ้นและความจุของอาร์เรย์ใหม่เป็นสองเท่าของค่าที่ระบุบวก 2; หากกำลังการผลิตปัจจุบันไม่น้อยกว่าค่าที่ระบุจะไม่มีการประมวลผลโดยตรง
ซอร์สโค้ด:
โมฆะสาธารณะ ensureCapacity (int minimumcapacity) {ถ้า (minimumcapacity> value.length) {expandcapacity (minimumcapacity); -ทดสอบ:
StringBuffer S = new StringBuffer (); System.out.println ("ความจุ:" + s.capacity ()); // ความจุ: 16 S.ensureCapacity (10); System.out.println ("ความจุ:" + s.capacity ()); // ความจุ: 16 S.ensureCapacity (30); System.out.println ("ความจุ:" + s.capacity ()); // ความจุ: 34 S.ensureCapacity (80); System.out.println ("ความจุ:" + s.capacity ()); // ความจุ: 80วิธี
วิธี codepointat ถูกนำมาใช้โดยใช้ character.codepointatimpl (ค่า, ดัชนี, นับ)
public int codepointat (int index) {if ((ดัชนี <0) || (ดัชนี> = count)) {โยน stringIndExOfBoundSexception ใหม่ (ดัชนี); } return character.codepointatimpl (ค่า, ดัชนี, นับ); -วิธีการ getChars ถูกนำมาใช้โดยใช้วิธี System.arrayCopy ()
โมฆะสาธารณะ getChars (int srcbegin, int srpender, char [] dst, int dstbegin) {ถ้า (srcbegin <0) โยน stringIndExouTofBoundSexception ใหม่ (SRCBEGIN); if ((srpender <0) || (srepner> count)) โยน stringIndExOutOfBoundSexception ใหม่ (SRPEND); if (srcbegin> srpender) โยน stringIndExOutOfBoundSexception ใหม่ ("SRCBEGIN> SRPEND"); System.arraycopy (ค่า, srcbegin, DST, dstbegin, srpender - srcbegin); -วิธีการผนวกเกี่ยวข้องกับวิธีการ ensurecapacityinternal () และวิธีการ getChars () เพื่อนำไปใช้
Public AbstractStringBuilder ผนวก (String str) {ถ้า (str == null) return uptendNull (); int len = str.length (); ensurecapacityInternal (นับ + len); str.getchars (0, len, ค่า, นับ); นับ += len; คืนสิ่งนี้; -array.copyof () ใช้เพื่อนำไปใช้
เป็นโมฆะ ExpandCapacity (int minimumCapacity) {int newCapacity = value.length * 2 + 2; if (newCapacity - minimumCapacity <0) newCapacity = minimumCapacity; if (newCapacity <0) {ถ้า (ขั้นต่ำสุดยอด <0) // ล้นโยน outofMemoryError ใหม่ (); newCapacity = integer.max_value; } value = array.copyof (ค่า, newCapacity); -array.fill (ค่า, นับ, newLength, '/0'); คัดลอกระหว่างสตริง
โมฆะสาธารณะ setLength (int newLength) {ถ้า (newLength <0) โยน stringIndExOfBoundSexception ใหม่ (newLength); ensurecapacityInternal (newLength); if (count <newLength) {array.fill (value, count, newLength, '/0'); } count = newLength; -DELETE () เปลี่ยนขนาดของสตริงเท่านั้นและไม่ได้ลบสตริงจริงๆ
Public AbstractStringBuilder DELETE (int start, int end) {ถ้า (เริ่มต้น <0) โยน stringIndExOutOfBoundSexception ใหม่ (เริ่มต้น); ถ้า (สิ้นสุด> นับ) สิ้นสุด = นับ; if (start> end) โยน stringIndExOutOfBoundSexception ใหม่ (); int len = end - เริ่ม; if (len> 0) {system.arraycopy (ค่าเริ่มต้น+len, ค่า, เริ่ม, นับ-สิ้นสุด); นับ -= len; } ส่งคืนสิ่งนี้; -เรียนรู้วิธีการใช้วิธีการ System.arrayCopy () อย่างยืดหยุ่นได้อย่างยืดหยุ่น
Public AbstractStringBuilder Insert (INT INDEX, Char [] Str, int Offset, int len) {ถ้า ((ดัชนี <0) || (ดัชนี> ความยาว ())) โยน stringIndExouToFBoundSexception ใหม่ (ดัชนี); if ((ออฟเซ็ต <0) || (len <0) || (ออฟเซ็ต> str.length - len)) โยน stringIndExOfBoundSexception ใหม่ ("ออฟเซ็ต" + ออฟเซ็ต + ", len" + len + ", str.length" + str.length); ensurecapacityInternal (นับ + len); System.arrayCopy (ค่า, ดัชนี, ค่า, ดัชนี + len, นับ - ดัชนี); System.ArrayCopy (STR, ชดเชย, ค่า, ดัชนี, LEN); นับ += len; คืนสิ่งนี้; -สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการตีความโดยละเอียดของซอร์สโค้ดของซอร์สโค้ด AbstractStringBuilder ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!