StringBuilder و StringBuffer هما فئتان شائعتان الاستخدامان لمعالجة السلاسل. كما نعلم جميعًا ، فإن stringBuilder هو متورط مؤشر الترابط ، في حين أن StringBuffer آمن مؤشر الترابط. تمت إضافة السابق بواسطة JDK1.5 ، وكان الأخير متاحًا في JDK1.0. دعنا نحلل تطبيقاتها الداخلية أدناه.
1. علاقة الميراث
الفئة النهائية العامة stringbufferextends AbstractStringBuilderImplements java.io.serializable ، charsequencepublic final stringbuilderextends AbstractStringBuilderImplements java.io.serializable ، charquence
يمكن أن نرى أن علاقة الميراث بين الفئتين هي نفسها بالضبط. التسلسل هو علم التسلسل. تتضمن واجهة charsequence charat () ، والطول () ، واللاتب () ، و tostring (). فئة السلسلة تنفذ أيضًا هذه الواجهة. ينصب التركيز هنا على الفئة التجريدية AbstractStringBuilder ، والتي تتضمن تنفيذ معظم عمليات StringBuilder و StringBuffer.
2. AbstractStringBuilder
1. المتغيرات وطرق البناء
char [] value ؛ int count ؛ AbstractStringBuilder () {} AbstractStringBuilder (int courm) {value = new char [cute] ؛}يستخدم AbstractStringBuilder صفيف char [] لحفظ السلاسل ، ويمكن تحديد طريقة السعة الأولية أثناء البناء.
2. توسيع السعة
public void public insureCapacity (int minimumcapacity) {if (minimumcapacity> 0) unsureCapacityInternal (minimumcapacity) ؛} private void insurecapacityIntern 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 (القيمة ، newCapacity) ؛}يتم تنفيذ طريقة التوسع في نهاية المطاف بواسطة expressacapacity (). في هذه الطريقة ، يتم توسيع السعة أولاً إلى السعة الأصلية بالإضافة إلى 2. إذا كانت لا تزال أقل من السعة المحددة في هذا الوقت ، فسيتم تعيين السعة الجديدة على الحد الأدنى. ثم حدد ما إذا كان يفيض. إذا كان يفيض ، فقم بتعيين القدرة على integer.max_value. أخيرًا ، من الواضح أن نسخ قيمة القيمة عبارة عن عملية تستغرق وقتًا طويلاً.
3
Public AbstractStringBuilder Append (String str) {if (str == null) return appendnull () ؛ int len = str.length () ؛ insureCapacityInternal (count + len) ؛ str.getchars (0 ، len ، value ، count) ؛ العد += لين ؛ إرجاع هذا ؛ }الإلحاح () هو الطريقة الأكثر استخدامًا ، فهي تحتوي على العديد من أشكال التحميل الزائد. ما سبق هو واحد منهم ، والذي يستخدم لإلحاق السلاسل. إذا كانت STR خالية ، فسيتم استدعاء طريقة AppendNull (). تضيف هذه الطريقة فعليًا أحرفًا مثل "N" و "U" و "L" و "L". إذا لم تكن فارغة ، فقم أولاً بتوسيع السعة ، ثم استدعاء طريقة GetChars () لسلسلة String لإلحاقها إلى نهاية القيمة. أخيرًا ، يتم إرجاع الكائن نفسه ، لذلك يمكن استدعاء الملحق () بشكل مستمر.
3. StringBuilder
قامت AbstractStringBuilder بتنفيذ معظم الطرق المطلوبة ، ويجب استدعاء StringBuilder و StringBuffer فقط. دعنا نلقي نظرة على تنفيذ StringBuilder.
1. مُنشئ
public stringBuilder () {super (16) ؛} public stringBuilder (int coutte) {super (cute) ؛} public stringBuilder (string str) {super (str.length () + 16) ؛ إلحاق (str) ؛} stringbuilder العامة (charsepresence seq) {this (seq.length () + 16) ؛ إلحاق (seq) ؛}كما يمكن أن نرى ، يبلغ حجم السعة الافتراضية لـ StringBuilder 16. بالطبع ، يمكنك أيضًا تحديد السعة الأولية ، أو تعيين القيمة الأولية لكائن StringBuilder في تسلسل حالي للأحرف.
2. طريقة إلحاق ()
Public StringBuilder Aspend (String str) {super.append (str) ؛ إرجاع هذا ؛} stringbuilder public append (charsevencence s) {super.append (s) ؛ أعد هذا ؛}هناك العديد من طرق التحميل الزائد للإلحاح () ، وهنا اثنان منهم. من الواضح ، هنا هي الطريقة في فئة Parent AbstractStringBuilder التي تسمى مباشرة.
3. tostring ()
السلسلة العامة toString () {// إنشاء نسخة ، لا تشارك سلسلة الإرجاع الجديدة (القيمة ، 0 ، العد) ؛}تقوم طريقة ToString () بإرجاع كائن سلسلة جديد لا يشارك الذاكرة مع الكائن الأصلي. في الواقع ، وينطبق الشيء نفسه على طريقة SUNDRING () في الملخصات.
4. Sringbuffer
يشبه StiringBuffer StringBuilder ، ولكن من أجل تحقيق التزامن ، تستخدم العديد من الطرق تعديل lsynchronized ، مثل الطريقة التالية:
طول int المتزامن العام () {return count ؛} stringBuffer المزامنة العامة (String str) {toStringCache = null ؛ super.append (str) ؛ إرجاع هذا ؛} setLength void المتزامن العام (int newLength) {toStringCache = null ؛ Super.SetLength (NewLength) ؛} كما ترون ، تتم إضافة المزامنة بالفعل أمام الطريقة.
بالإضافة إلى ذلك ، هناك أيضًا متغير TostringCache في طرق الإلحاح () و setLength () أعلاه. يتم استخدام هذا المتغير لذاكرة التخزين المؤقت الأخيرة لطريقة ToString (). في أي وقت يتم تعديل StringBuffer ، سيتم تعيين هذا المتغير إلى NULL. إن tostring من StringBuffer هو كما يلي:
سلسلة متزامنة عامة toString () {if (toStringCache == null) {toStringCache = arrays.copyofrange (value ، 0 ، count) ؛ } إرجاع سلسلة جديدة (ToStringCache ، True) ؛}في هذه الطريقة ، إذا كان ToStringCache فارغًا ، فسيتم تخزينه مؤقتًا أولاً. يختلف كائن السلسلة النهائي الذي تم إرجاعه قليلاً ، وهذا المُنشئ له معلمة صحيحة. ابحث عن رمز السلسلة المصدر وألقي نظرة:
string (char [] value ، boolean share) {// assert share: "غير مدعوم غير مدعوم" ؛ this.value = value ؛}اتضح أن كائن السلسلة الذي تم إنشاؤه بواسطة طريقة البناء هذه لا ينسخ السلسلة فعليًا ، ولكنه يشير فقط إلى القيمة إلى معلمات البناء ، وهو توفير الوقت لنسخ الوقت. ومع ذلك ، فإن هذا المنشئ لديه أذونات الوصول إلى الحزمة ولا يمكن استدعاؤها بشكل عام.
لخص
ما سبق هو كل شيء عن هذا المقال. آمل أن يكون من المفيد للجميع أن يتعلموا فئتين شائعتين لسلسلة التشغيل في Java و StringBuilder و StringBuffer.