لأنه عند النظر إلى الكود المصدري لـ StringBuffer و StringBuilder ، فقد وجد أن كلاهما ورثوا AbstractStringBuilder ، والعديد من الطرق هي طرق من الفئة الأصل AbstractStringBuilder مباشرة ، لذلك قررت أن ننظر إلى رمز المصدر لـ AbstractStringBuilder أولاً ، ثم أنظر إلى StringBuffer و StringBuilder.
الموقع: في حزمة java.lang
البيان: مجردة Class AbstractStringBuilderImplembements.
يحتوي فئة AbstractStringBuilder على تعديل تجريدي ، مما يدل على أنه لا يمكن إنشاء مثيل له.
تحتوي فئة AbstractStringBuilder على فئتين فرعيتين: StringBuilder و StringBuffer.
الحقول
/*** يتم استخدام القيمة لتخزين الأحرف. */ قيمة char [] ؛ /*** العد هو عدد الأحرف المستخدمة. */ int العد ؛
مُنشئ
1. مُنشئ بدون معلمة
AbstractStringBuilder () {}2. عند إنشاء كائن من فئة تنفيذ AbstractStringBuilder ، حدد حجم المخزن المؤقت إلى السعة.
AbstractStringBuilder (int courm) {value = new char [caption] ؛ }عندما يتم إنشاء مثيل لسلسلة StringBuilder أو StringBuffer ، يتم استدعاء هذا المُنشئ في المنشئ.
توسيع السعة
void expandCapacity(int minimumCapacity)
تحتوي هذه الطريقة على أذونات الوصول إلى الحزمة ، وسوف تستدعي طرق متعددة في الفصل هذه الطريقة لتوسيع السعة عندما تكون السعة غير كافية.
رمز المصدر:
void expancapity (int minimumcapacity) {int newCapacity = (value.length + 1) * 2 ؛ if (newCapacity <0) {newCapacity = integer.max_value ؛ } آخر إذا (MinimumCapacity> newCapacity) {newCapacity = minimumCapacity ؛ } value = arrays.copyof (value ، newCapacity) ؛ }أضف طول المخزن المؤقت بمقدار 1 × 2 إلى NewCapacity المتغير ، ثم قارن هذه القيمة بالقيمة المحددة ، وحدد القيمة الأكبر كطاقة جديدة للمخزن المؤقت ؛ ثم اتصل بطريقة CopyOf لفئة المصفوفات ، والتي تنشئ صفيفًا جديدًا ثم نسخ جميع الأحرف في الصفيف الأصلي إلى الصفيف الجديد.
SecureCapacity (INT MinimumCapacity)
public void insurecapacity (int minimumcapacity)
تأكد من أن السعة تساوي على الأقل القيمة الدنيا المحددة. إذا كانت السعة الحالية أقل من القيمة المحددة ، يتم إنشاء صفيف جديد ، وقدرة الصفيف الجديد هي ضعف القيمة المحددة بالإضافة إلى 2 ؛ إذا كانت السعة الحالية لا تقل عن القيمة المحددة ، فلن يتم إجراء أي معالجة مباشرة.
رمز المصدر:
public void insureCapacity (int minimumcapacity) {if (minimumcapacity> value.length) {sextenceCapacity (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 باستخدام الحرف. codepointatimpl (القيمة ، الفهرس ، العد)
public int codepointat (int index) {if ((index <0) || (index> = count)) {throw new StringIndExOutOfBoundSexception (index) ؛ } return character.codepointatimpl (القيمة ، الفهرس ، العد) ؛ }يتم تطبيق طريقة getChars باستخدام طريقة System.arrayCopy ()
public void getChars (int srcbegin ، int srcend ، char [] dSt ، int dstbegin) {if (srcbegin <0) remingindexoutofboundsexception (srcbegin) ؛ if ((srcend <0) || (srcend> count)) رمي stringIndExoutofBoundSexception (srcend) ؛ إذا (srcbegin> srcend) رمي stringIndExOutofBoundSexception ("srcbegin> srcend") ؛ System.ArrayCopy (القيمة ، srcbegin ، dst ، dstbegin ، srcend - srcbegin) ؛ }تتضمن طريقة الإلحاق طريقة insurecapacityInternal () وطريقة getChars () لتنفيذها
Public AbstractStringBuilder Append (String str) {if (str == null) return appendnull () ؛ int len = str.length () ؛ insureCapacityInternal (count + len) ؛ str.getchars (0 ، len ، value ، count) ؛ العد += لين ؛ إرجاع هذا ؛ }يستخدم arrays.copyof () للتنفيذ
void expantcapity (int minimumcapacity) {int newCapacity = value.length * 2 + 2 ؛ إذا (NewCapacity - MinimumCapacity <0) NewCapacity = MinimumCapacity ؛ if (newCapacity <0) {if (minimumcapacity <0) // overflow رمي جديد OutOfMemoryError () ؛ newCapacity = integer.max_value ؛ } value = arrays.copyof (value ، newCapacity) ؛ }arrays.fill (القيمة ، العد ، newLength ، '/0') ؛ نسخ بين السلاسل
public void setLength (int newLength) {if (newLength <0) رمي stringIndExOutoFBoundSexception (newLength) ؛ insureCapacityInternal (NewLength) ؛ if (count <newLength) {arrays.fill (value ، count ، newLength ، '/0') ؛ } count = newLength ؛ }حذف () يغير فقط حجم السلسلة ولا يحذف السلسلة حقًا
Public AbstractStringBuilder Delete (int start ، int end) {if (start <0) رمي stringIndExOutofBoundSexception (ابدأ) ؛ if (end> count) end = count ؛ إذا (start> end) رمي stringIndExOutofBoundSexception () ؛ int len = end - start ؛ if (len> 0) {system.arrayCopy (القيمة ، ابدأ+len ، القيمة ، البدء ، العد) ؛ العد -= لين ؛ } إرجاع هذا ؛ }تعلم كيفية استخدام طريقة System.arrayCopy () بمرونة
Public AbstractStringBuilder INSERT (int index ، char [] str ، int indess ، int len) {if ((index <0) || (index> length ())) رمي stringIndexoutofBoundSexception (الفهرس) ؛ if ((Offset <0) || (len <0) || (Offset> str.length - len)) رمي stringIndExOutoFBoundSexception ("Offset" + Offset + "، len" + len + "، str.length" + str.length) ؛ insureCapacityInternal (count + len) ؛ System.ArrayCopy (القيمة ، الفهرس ، القيمة ، الفهرس + LEN ، العد - الفهرس) ؛ System.ArrayCopy (Str ، Offset ، Value ، INDEX ، LEN) ؛ العد += لين ؛ إرجاع هذا ؛ }لخص
ما سبق هو كل محتوى هذه المقالة حول التفسير التفصيلي للرمز المصدري لرمز مصدر فئة AbstractStringBuilder. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!