تسلسل السلاسل في جافا
سلسلة السلسلة هي عملية دمج سلسلتين صغيرتين أو أكثر لإنشاء سلسلة نهائية. على سبيل المثال، يمكنك إنشاء الاسم الكامل عن طريق تسلسل الاسم الأول واسم العائلة للشخص. توفر Java عدة طرق لتسلسل السلاسل ، ولكن أسهلها هو استخدام عامل التشغيل +. نبسب؛ هناك أربع طرق لتسلسل السلاسل في Java:
- عامل التسلسل ' + < / span>'< / li>
- الدالة String.concat()
- نمط StringBuilder< / span >< / li>
- نمط StringBuffer< / span >< / li>< / ol>
سلاسل متسلسلة مع عامل التشغيل   < / h2 > يمكنك استخدام عامل التشغيل '
+ < / span > لربط سلسلتين أو أكثر ، فهذه هي أسهل طريقة لإنجاز المهمة. على سبيل المثال ، سينتج "One" + "Two" كائن السلسلة "OneTwo". يمكنك استخدام عامل التشغيل هذا لدمج سلسلتين على الأقل ، على سبيل المثال: "ab" + "cde" + fghi" سيعطي "abcdefghi" ، ويمكنك أيضا استخدام متغيرات السلسلة.
يتم تحويل هذه العملية بواسطة المترجم إلى:
< pre class = "prettyprint lang-java" >new StringBuilder () .append ("string1") .append ("string2") .toString ()
< / pre> يقوم هذا البرنامج بتسلسل سلسلتين: < / div> public class Concatenation_string {
الفراغ العام الثابت الرئيسي (String[] args) {
String s1 = "string1" ؛
السلسلة s2 = "string2" ؛
سلسلة s1s2 = concatenation_strings_java (s1 ، s2) ؛
System.out.println (s1s2) ؛
}
concatenation_strings_java سلسلة ثابتة عامة (سلسلة s1 ، سلسلة s2) {
إرجاع s1 + s2 ؛
}
}
< / pre>وقت التشغيل:
< pre class = "prettyprint lang-java" >string1chain2
< / pre> سلسلة مع طريقة String.concat () < / h2 > تقوم هذه الطريقة بتسلسل سلسلة واحدة في نهاية أخرى. ترجع الطريقة سلسلة بقيمة السلسلة التي تم تمريرها في الطريقة المتسلسلة مع نهاية السلسلة المستخدمة لاستدعاء هذه الطريقة.
public String concat(String s)
example:
public class Concatenation_string {
الفراغ العام الثابت الرئيسي (String[] args) {< br / > سلسلة s = "أنا واحد" ؛
s = s.concat ("مبرمج") ؛
System.out.println(s);
}
}
< / pre>وقت التشغيل:
< pre class = "prettyprint lang-java" >أنا مبرمج < br / >< / pre>الفرق بين عامل التشغيل "+" وطريقة String.concat () < / h2 > لتتمكن من التمييز بين عامل التشغيل " + < / span > 'ونمط concat() ، سنعمل مع مثال عملي.
a+=b
a.concat(b)
أولا، هناك اختلاف بسيط في الدلالات. إذا كان a هو فارغ< / span> ، ثم a.concat(b) يؤدي إلى تشغيل نمط NullPointerException < / span > ، ولكن نمط < span = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" > + < / span > ' في العبارة a+=b يعالج قيمة a< / span> حتى لو كان فارغ < / امتداد>. بالإضافة إلى ذلك ، فإن طريقة concat() قيم السلسلة فقط بينما يقوم عامل التشغيل "+" بتحويل القيمة إلى سلسلة (باستخدام النمط إلى سلسلة () < / سبان > ). يمكننا القول أن الطريقة concat() أكثر صرامة من حيث أنه يقبل.
يمكنك كتابة هذا الرمز ومعرفة ما تحصل عليه في الإخراج:
الفراغ الثابت العام الرئيسي (String[] args) {
String s = null;
s = s.concat ("مبرمج") ؛
System.out.println(s);
}
< / pre> يجب أن يكون لديك هذا في وقت التشغيل:
< pre class = "prettyprint lang-java" > استثناء في مؤشر الترابط "الرئيسي" java.lang.NullPointerException < br / > في Concatenation_string.main (Concatenation_string.java: 5)
< / pre> نفس المثال مع عامل التشغيل " + < / span>':
< pre class = "prettyprint lang-java" > الفراغ الثابت العام الرئيسي (سلسلة [] args) {
سلسلة s = فارغة ؛
s = s + مبرمج ؛
System.out.println(s);
}
يجب أن تحصل على هذه النتيجة:
nullprogrammer
لذلك ، كما قلنا سابقا ، فإن المشغل ' + < / span > 'يعادل :
< pre class = "prettyprint lang-java" >a = StringBuilder الجديد ()
.append (a)
.append (b)
.toString (); < / pre> سلاسل متسلسلة مع StringBuffer و StringBuilder < / h2 > تقلل وسيلة التسلسل هذه من تكاليف الذاكرة والوقت لأنها لن تولد كائنات سلسلة. في الواقع ، يجب عليك دائما استخدام StringBuilder بدلا من StringBuffer لأنه يحتوي على نفس الوظيفة ولكن بدون مزامنة ، مما يعني عملية أسرع. يؤدي استخدام StringBuffer أو StringBuilder أيضا إلى تعليمات برمجية منظمة كما هو موضح أدناه:
< pre class = "prettyprint lang-java" > نتيجة السلسلة = StringBuilder (15) .append (name) .append (" ") .append (firstname) .toString ();
< / pre> يمكنك أن ترى مدى سهولة ربط سلاسل متعددة باستخدام StringBuilder. ومع ذلك ، تذكر تهيئة StringBuilder بسعة تساوي عدد الأحرف في السلسلة النهائية. سيمنع هذا فقدان الذاكرة غير القابلة للاستخدام عن طريق تهيئة السلسلة بشكل صحيح وتقليل وقت وحدة المعالجة المركزية.
فيما يلي مثال على برنامج java الذي سيوضح لك كيفية ربط سلسلة باستخدام StringBuilder و StringBuffer.
< pre class = "prettyprint lang-java" > الفراغ الثابت العام الرئيسي (String [] args) {
String court = "Court" ؛
سلسلة module_math = "الرياضيات" ؛
/* StringBuilder * /
سلسلة module_res = "شبكات" ؛
int length = court.length () + module_math.length () ؛
StringBuilder sb = StringBuilder الجديد (الطول) ؛
sb.append(court).append(module_math);
دقة السلسلة = sb.toString ();
System.out.println(res);
/* StringBuilder * / < br / > length = court.length () + module_math.length () ؛
StringBuffer sBuffer = StringBuffer جديد (الطول) ؛
sb.append(" و").append(court).append(module_res);
res = sb.toString ();
System.out.println(res);
}
< / pre> الإخراج:
Math Courtyard
Math Courtyard و Network Courtyard
< / pre> أداء سلسلة التسلسل في Java< / h2>من الواضح أن أسهل وأسرع طريقة لتسلسل السلاسل هي استخدام عامل التشغيل "+" وهو يعمل بشكل جيد للغاية عندما يكون لديك سلسلتان فقط ، ولكن إذا كنت بحاجة إلى ربط آلاف السلاسل وخاصة داخل حلقة ، فسينخفض الأداء مع عامل التشغيل "+". سبب الأداء الضعيف هو إنشاء دفعات مؤقتة لكائنات السلسلة. إذا كان لديك الكثير من السلاسل في برنامجك ، فيمكنك رؤية النتائج أدناه التي توضح أن أفضل طريقة للتسلسل على نطاق واسع هي استخدام فئة سترينج بيلدر< / سبان>. تم إجراء هذه الإحصائيات في بيئة Windows 7 64 بت ، معالج Core 2 Duo (2.53 جيجاهرتز) مع 4 جيجابايت من ذاكرة الوصول العشوائي
< pre class = "prettyprint lang-java" > الفراغ الثابت العام الرئيسي (String [] args) {
int nb_op = 10000 ؛
سلسلة s = ""; < br / >
مزدوج t1 ، t2 ، الوقت ؛
t1 = System.currentTimeMillis ();
for (int i = 0 ; i < nb_op; i ++)
s += "*" ؛
t2 = System.currentTimeMillis ();
الوقت = t2-t1 ؛
System.out.println ("+: "+time);
s="";
t1 = System.currentTimeMillis ();
for (int i = 0 ; i < nb_op; i ++)
s.concat ("*") ؛
t2 = System.currentTimeMillis ();
الوقت = t2-t1 ؛
System.out.println ("concat: "+time);
StringBuilder sb = جديد StringBuilder ();
t1 = System.currentTimeMillis ();
for(int i = 0 ; i < nb_op; i++)
sb.append("*");
t2 = System.currentTimeMillis ();
الوقت = t2-t1 ؛
System.out.println ("StringBuilder: "+ الوقت);
StringBuffer sBuffer = StringBuffer الجديد () ؛
t1 = System.currentTimeMillis ();
for(int i = 0 ; i < nb_op; i++)
sBuffer.append("*");
t2 = System.currentTimeMillis ();
الوقت = t2-t1 ؛
System.out.println ("StringBuffer: "+time);
}
نتائج عمليات التسلسل 10000:
+: 180.0
concat: 13.0
StringBuilder: 2.0
StringBuffer: 4.0