رؤية هذا التفسير أمر جيد ، لذلك سأقوم بتشغيله
هناك 3 فصول في Java مسؤولة عن عمليات الشخصية.
1. الشخصية هي عملية شخصية واحدة.
2. تعمل على سلسلة من الأحرف ، فئة غير قابلة للتغيير.
3.StringBuffer هي أيضًا عملية على سلسلة من الأحرف وهي فئة قابلة للتغيير.
خيط:
إنه كائن وليس نوعًا بدائيًا.
إنه كائن ثابت وبمجرد إنشاءه ، لا يمكن تعديل قيمته.
تعديل كائنات السلسلة الحالية هو إعادة إنشاء كائن جديد وحفظ القيمة الجديدة فيه.
السلسلة هي فئة نهائية ، أي أنه لا يمكن موروثة.
StringBuffer:
إنه كائن قابل للتغيير.
لا يمكن إنشاؤه إلا من قبل البنائين ،
StringBuffer SB = New StringBuffer () ؛
ملاحظة: لا يمكن دفعه بواسطة رموز المهمة.
SB = "مرحبًا بك هنا!" ؛ // خطأ
بعد إنشاء الكائن ، سيتم تخصيص مساحة الذاكرة في الذاكرة وسيتم حفظها في البداية.
SB.Append ("Hello") ؛
كفاءة StringBuffer أعلى من تلك الموجودة في السلسلة في سلسلة متسلسل:
سلسلة str = سلسلة جديدة ("مرحبًا بك في") ؛
str += "هنا" ؛
خطوة المعالجة هي في الواقع عن طريق إنشاء stringBuffer ، ثم الاتصال على الملحق () ، وأخيراً
ثم إضافة stringbuffer tosting () ؛
وبهذه الطريقة ، سيكون لعملية اتصال السلسلة بعض العمليات الإضافية من StringBuffer ، وبالطبع سيتم تقليل الكفاءة.
ونظرًا لأن كائن السلسلة هو كائن ثابت ، فإن كل عملية من اللدغة ستعيد إنشاء كائن جديد لحفظ القيمة الجديدة.
وبهذه الطريقة ، سيكون الكائن الأصلي عديم الفائدة وسيتم جمع القمامة.
ألقِ نظرة على الكود التالي:
كرر 26 رسائل إنجليزية 5000 مرة.
نسخة الكود كما يلي:
String TempStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ؛
الأوقات الداخلية = 5000 ؛
long lstart1 = system.currentTimeMillis () ؛
سلسلة str = "" ؛
لـ (int i = 0 ؛ i <times ؛ i ++) {
str += tempstr ؛
}
Long Lend1 = System.CurrentTimeMillis () ؛
وقت طويل = (Lend1 - LSTART1) ؛
system.out.println (time) ؛
لسوء الحظ ، فإن جهاز الكمبيوتر الخاص بي ليس حاسوبًا فائقًا ، والنتائج التي أحصل عليها ليست بالضرورة هي نفسها في كل مرة ، وعادة ما تكون حوالي 46687.
هذا هو 46 ثانية.
لنلقي نظرة على الكود التالي
نسخة الكود كما يلي:
String TempStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ؛
الأوقات الداخلية = 5000 ؛
Long lstart2 = system.currentTimeMillis () ؛
StringBuffer SB = New StringBuffer () ؛
لـ (int i = 0 ؛ i <times ؛ i ++) {
SB.Append (TempStR) ؛
}
Long Lend2 = System.CurrentTimeMillis () ؛
الوقت الطويل 2 = (Lend2 - LSTART2) ؛
system.out.println (time2) ؛
والنتيجة هي 16 وأحيانًا تكون 0
لذا فإن الاستنتاج واضح ، فإن سرعة StringBuffer هي ما يقرب من عشرات الآلاف من المرات. بالطبع ، هذه البيانات ليست دقيقة للغاية. لأن عدد الدورات 100000 مرة ، فإن الفرق أكبر. إذا كنت لا تصدقني ، حاول
إذا كنت لا تزال لا تستطيع أن تفهم:
1) الفرق بين طريقة المفصل + للسلسلة وطريقة إلحاق StringBuff:
عندما يقوم مشغل String + بإجراء عملية السلسلة ، يقوم أولاً بتحويل كائن السلسلة الحالي إلى نوع StringBuff ، ويقوم باستدعاء طريقة الإلحاق الخاصة به ، وأخيراً يقوم بتحويل كائن StringBuff الذي تم إنشاؤه إلى سلسلة نوع السلسلة من خلال طريقة toString الخاصة به ، لذلك فهي غير فعالة.
ومع ذلك ، من حيث قابلية القراءة ، لا يزال مشغل اتصال السلسلة مرتفعًا.
2) StringBuff آمن مؤشر ترابط
السلسلة غير آمنة للخيوط
3) السلسلة هي كائن سلسلة لا يمكن تعديله ، بينما يتم تعديل StringBuff.
نسخة الكود كما يلي:
pilecopy الثابتة العامة (سلسلة SRCSTR ، سلسلة DestSt) {
ملف srcfile = null ؛
ملف destfile = null ؛
قارئ القارئ = فارغ ؛
كاتب الكاتب = فارغ ؛
العلم المنطقي = خطأ ؛
يحاول {
srcfile = ملف جديد (SRCSTR) ؛
if (! srcfile.exists ()) {
System.out.println ("ملف المصدر غير موجود") ؛
System.exit (0) ؛
} آخر {
reader = new fileReader (srcfile) ؛
}
DestFile = ملف جديد (DestSt) ؛
كاتب = جديد filewriter (destfile) ؛
char [] Buff = new Char [1024] ؛
int len ؛
سلسلة str = "" ؛
StringBuffer sbuff = new StringBuffer () ؛
بينما ((len = reader.read (buff))! = -1) {
// str += سلسلة جديدة (Buff ، 0 ، len) ؛
sbuff.append (سلسلة جديدة (Buff ، 0 ، len)) ؛
}
// writer.write (str.tochararray ()) ؛
Writer.Write (sbuff.toString (). Tochararray ()) ؛
العلم = صحيح ؛
الكاتب. flush () ؛
reader.close () ؛
الكاتب.
} catch (ioException e) {
System.out.println ("File Copy Exception: =" + E.GetMessage ()) ؛
}
العلم العودة
}