اعتدت في كثير من الأحيان رؤية مناقشات حول الربط سلسلة Java والجوانب الأخرى على الإنترنت. رأيت بعض مطوري Java في اقتراحاتهم للمبرمجين المبتدئين مثل ما يلي:
لا تستخدم علامة + لصياغة سلاسل ، استخدم طريقة إلحاق () من stringBuffer أو StringBuilder لتوصيل السلاسل.
ومع ذلك ، فمن المزعج حقًا لصق السلاسل مع علامات +. لا يوجد شيء جيد حول استخدام + علامات لصق السلاسل؟
من خلال البحث عن بعض المحتوى حول فئة السلسلة في وثائق Java API ، يمكننا أن نرى المقتطف التالي:
"توفر لغة Java دعمًا خاصًا لرموز تسلسل السلسلة ("+") وتحويل كائنات أخرى إلى سلاسل. يتم تنفيذ تسلسل السلسلة من خلال فئة StringBuilder (أو StringBuffer) وطريقة إلحاقها.
يخبرنا هذا المقطع بوضوح أنه في Java ، يتم بالفعل تطبيق سلاسل الربط + Sign Sign بواسطة StringBuffer أو StringBuilder وطريقة إلحاقها.
بالإضافة إلى وثائق Java API ، يمكننا أيضًا استخدام الأداة لعرض أمر bytecode لملف الفئة للحصول على الإجابة أعلاه. على سبيل المثال رمز:
public static void main (string [] args) {string a = "hello" ؛ السلسلة B = "العالم" ؛ سلسلة str = a + b + "!" ؛ system.out.println (str) ؛} الأمر لعرض رمز bytecode المقابل من خلال الأداة هو كما يلي:
من أمر bytecode ، يمكننا أن نرى بوضوح أن الرمز التالي الذي كتبناه
سلسلة str = a + b + "!" ؛
تم تحويله إلى بيان مشابه لما يلي:
String str = new StringBuilder (string.valueof (a)). إلحاق (b) .append ("!"). toString () ؛ليس ذلك فحسب ، فإن برنامج التحويل البرمجي Java هو أيضًا مترجم ذكي نسبيًا. عندما يكون الربط + الإشارة إلى حرفي سلسلة ، فإن برنامج التحويل البرمجي Java سيقوم بتحويله بذكاء إلى سلسلة كاملة أثناء التجميع. على سبيل المثال:
public static void main (string [] args) {String str = "hello" + "World" + "، Java!" ؛ system.out.println (str) ؛} يرسل برنامج التحويل البرمجي Java هذا النوع من الخيط مباشرةً والذي يحوله إلى سلسلة كاملة عند تجميعه.
حتى إذا كانت هناك متغيرات في السلسلة المقسمة مع علامة + ، فإن برنامج التحويل البرمجي Java سيقوم بدمج حرفي السلسلة الأمامية في سلسلة واحدة.
public static void main (string [] args) {string java = "، java!" ؛ String str = "Hello" + "World" + Java ؛ system.out.println (str) ؛}مما سبق ، يمكن ملاحظة أنه بالنسبة لعملية مثل String STR = Str1 + Str2 + Str3 + Str4 ، لا توجد مشكلة في ربط سلاسل متعددة في وقت واحد.
في Java ، تكون كائنات السلسلة غير قابلة للتغيير (غير قابلة للتغيير). في الكود ، يمكنك إنشاء أسماء مستعارة متعددة لكائن سلسلة معين. لكن مراجع هذه الأسماء المستعارة هي نفسها.
على سبيل المثال ، S1 و S2 هما مستعاران للكائنات "droidyue.com" ، ويتم تخزين الاسم المستعار في إشارات إلى الكائن الحقيقي. لذا S1 = S2
السلسلة s1 = "droidyue.com" ؛ السلسلة s2 = s1 ؛ system.out.println ("S1 و S2 لهما نفس المرجع =" + (s1 == s2)) ؛وفي Java ، يرتبط المشغل الوحيد المحمّل بالربط بالسلسلة. +،+=. إلى جانب ذلك ، لا يسمح مصممو Java بمشغليهم الآخرين.
في Java ، يرتبط المشغل الزائد الوحيد بالربط سلسلة. +،+=. إلى جانب ذلك ، لا يسمح مصممو Java بمشغليهم الآخرين.
كما نعلم جميعًا ، قبل Java 1.4 ، يمكن استخدام خياطة السلسلة لصياغة السلاسل. بدءًا من Java 1.5 ، يمكننا استخدام StringBuilder لربط السلاسل. الفرق الرئيسي بين StringBuffer و StringBuilder هو أن StringBuffer آمن مؤشر ترابط وهو مناسب لتشغيل السلاسل متعددة الخيوط ؛ StringBuilder آمن مؤشر ترابط وهو مناسب لتشغيل السلاسل تحت موضوع واحد. ومع ذلك ، يتم تنفيذ معظم عمليات خياطة السلسلة الخاصة بنا تحت موضوع واحد ، لذلك يعد استخدام StringBuilder مفيدًا للأداء.
قبل Java 1.4 ، استخدم برنامج التحويل البرمجي StringBuffer للتعامل مع السلاسل مع سلاسل التوقيع المتساقطة +. بدءًا من Java 1.5 ، استخدم برنامج التحويل البرمجي StringBuilder للتعامل مع السلاسل مع سلاسل التوقيع المتساقطة في معظم الحالات.
عندما نكتب رمزًا في بيئة JDK 1.4 ، يوصى باستخدام علامة + للتعامل مع الموقف أعلاه حيث يتم تقطيع سلاسل متعددة مرة واحدة. وبهذه الطريقة ، عندما تتم ترقية JDK إلى 1.5 وما فوق ، سيقوم المترجم تلقائيًا بتحويله إلى StringBuilder لتوصيل السلاسل ، وبالتالي تحسين كفاءة الربط السلسلة.
بالطبع ، يقتصر الاستخدام الموصى به لسلاسل الربط + علامة + فقط على استخدام سلاسل متعددة في بيان. إذا قمت بتوصيل سلسلة في عبارات متعددة ، فلا يزال من المستحسن استخدام StringBuffer أو StringBuilder. على سبيل المثال:
public static void main (string [] args) {string java = "، java!" ؛ سلسلة str = "" ؛ str += "Hello" ؛ Str += "World" ؛ str += java ؛ system.out.println (str) ؛} أوامر البايت المترجمة للمترجم هي كما يلي:
من الصورة أعلاه ، يمكننا أن نعلم أن كل عبارة + علامة الربط تنشئ كائن stringbuilder جديد. هذا الموقف واضح بشكل خاص في ظل ظروف الدورة ، مما يؤدي إلى خسائر كبيرة نسبيًا في الأداء. لذلك ، يوصى بشدة باستخدام StringBuffer أو StringBuilder للتعامل مع السلاسل في عبارات متعددة.
حول التحسين الذي جلبه باستخدام StringBuilder
بالإضافة إلى ذلك ، عند استخدام StringBuffer أو StringBuilder ، يمكننا أيضًا استخدام الطريقة التالية لزيادة تحسين الأداء (يأخذ الرمز التالي StringBuilder كمثال ، تشبه StringBuffer هذا).
1. توقع الحد الأقصى لطول السلسلة النهائية التي تم الحصول عليها.
يبلغ الطول الافتراضي لمصفوفة char داخل StringBuilder 16. عندما نلحق السلسلة وتجاوز هذا الطول ، سيقوم StringBuilder بتوسيع قدرة الصفيف الداخلي لتلبية الاحتياجات. في هذه العملية ، يقوم StringBuilder بإنشاء صفيف شار جديد وأكبر وأكبر ونسخ البيانات من الصفيف الأصلي إلى الصفيف الجديد. إذا تمكنا من التنبؤ تقريبًا بالحد الأقصى للسلسلة التي يتم تقسيمها أخيرًا ، فيمكننا تحديد السعة الأولية للحجم المناسب عند إنشاء كائن StringBuilder. على سبيل المثال ، نحتاج إلى لصق للحصول على سلسلة تحتوي على 100 حرف أ. يمكنك كتابة الرمز التالي:
StringBuilder SB = New StringBuilder (100) ؛ لـ (int i = 0 ؛ i <100 ؛ i ++) {sb.append ('a') ؛} system.out.println (sb) ؛يرجى التوازن وفقًا للشروط الفعلية لإنشاء StringBuilder مناسب للسعة الأولية.
2. بالنسبة للأحرف الفردية ، استخدم نوع char بدلاً من نوع السلسلة قدر الإمكان.
في بعض الأحيان ، نحتاج إلى إلحاق حرف واحد بعد السلسلة (على سبيل المثال: أ) ، ويجب أن نستخدمه قدر الإمكان في هذا الوقت.
sb.append ('a') ؛بدلا من استخدام:
SB.Append ("A") ؛