أعتقد أن كل شخص لديه فهم جيد للفرق بين String و StringBuffer، ولكن من المقدر أنه لا يزال هناك العديد من الرفاق الذين ليس لديهم فكرة واضحة عن مبادئ عمل هاتين الفئتين، وسأقوم اليوم بمراجعة هذا المفهوم للجميع، ومن خلال الطريقة التي يقدم بها J2SE 5.0 فئة جديدة لمعالجة الشخصيات - StringBuilder (لا تتسرع في رمي الطوب علي، ما زلت رصينًا، وأنا لا أتحدث عن C# هنا، لدى Java أيضًا فئة StringBuilder). إذن ما هي الاختلافات بين StringBuilder و StringBuffer وفئة String التي التقينا بها لأول مرة؟ أيهما يجب أن نستخدمه في المواقف المختلفة؟ أود أن أشارككم آرائي حول هذه الفئات، وآمل أيضًا أن يتمكن الجميع من إبداء آرائهم، لقد ارتكب الجميع أخطاء، وأثناء تصحيحها، فهي فرصة جيدة للتعلم.
باختصار، الفرق الرئيسي في الأداء بين نوع String ونوع StringBuffer هو في الواقع أن String كائن غير قابل للتغيير (لماذا؟ اسأل مصممي Java، لماذا لا تعتبر String نوعًا أصليًا؟) لذلك، في كل مرة يتم فيها تغيير نوع String في الواقع، إنه يعادل إنشاء كائن سلسلة جديد، ثم توجيه المؤشر إلى كائن السلسلة الجديد، لذلك من الأفضل عدم استخدام السلسلة للسلاسل التي غالبًا ما تغير المحتوى. ، لأنه في كل مرة يتم فيها إنشاء كائن، سيكون له تأثير على أداء النظام. خاصة عندما يكون هناك عدد كبير جدًا من الكائنات غير المرجعية في الذاكرة، سيبدأ GC الخاص بـ JVM في العمل، وستكون السرعة بطيئة جدًا بالتأكيد. وإليك مثالاً غير مناسب جدًا:
سلسلة S1 = "اي بي سي"؛
For(int I = 0; I < 10000; I ++) // ليحاكي استدعاءات متعددة للبرنامج
{
S1 + = "def";
S1 = "اي بي سي";
}
إذا كان هذا هو الحال، بعد اكتمال حلقة for، إذا لم يتم مسح الكائنات الموجودة في الذاكرة بواسطة GC، فسيكون هناك أكثر من 20000 في الذاكرة، وهو رقم مذهل، وإذا كان هذا نظامًا يستخدمه الكثيرون الناس، فالعدد ليس كبيرًا جدًا، لذا يجب على الجميع توخي الحذر عند استخدامه.
إذا كنت تستخدم فئة StringBuffer، فستكون النتائج مختلفة في كل مرة ستكون النتيجة عبارة عن عملية على كائن StringBuffer نفسه، بدلاً من إنشاء كائن جديد ثم تغيير مرجع الكائن. لذا نوصي بشكل عام باستخدام StringBuffer، خاصة عندما تتغير كائنات السلسلة بشكل متكرر. في بعض الحالات الخاصة، يتم تفسير تسلسل كائنات السلسلة فعليًا بواسطة JVM على أنه تسلسل لكائنات StringBuffer، لذلك في هذه الحالات لن تكون سرعة كائنات السلسلة أبطأ من سرعة كائنات StringBuffer، وخاصة كائنات السلسلة التالية من بينها، كفاءة السلسلة أسرع بكثير من StringBuffer:
String S1 = "هذا مجرد" + "بسيط" + "اختبار"؛
StringBuffer Sb = new StringBuilder("هذا مجرد").append("simple").append("test");
سوف تتفاجأ عندما تجد أن سرعة إنشاء كائنات String S1 هي ببساطة سريعة جدًا، وفي هذا الوقت ليس لدى StringBuffer أي ميزة على الإطلاق في السرعة. في الواقع، هذه خدعة JVM في نظر JVM
String S1 = "هذا مجرد اختبار" + "بسيط" + "اختبار"؛ في الواقع، هو: String S1 = "هذا مجرد اختبار بسيط"؛ لكن ما يجب على الجميع ملاحظته هنا هو أنه إذا كانت السلسلة الخاصة بك تأتي من كائن String آخر، فلن تكون السرعة بهذه السرعة، على سبيل المثال:
السلسلة S2 = "هذا مجرد"؛
سلسلة S3 = "بسيطة"؛
سلسلة S4 = "اختبار"؛
السلسلة S1 = S2 +S3 + S4؛
في هذا الوقت، سيتصرف JVM بالطريقة الأصلية، ولن تكون سرعة إنشاء كائنات S1 بالسرعة التي كانت عليها من قبل، يمكننا إجراء اختبار للتحقق منها لاحقًا.
من هذا نحصل على استنتاج الخطوة الأولى: في معظم الحالات StringBuffer > String
وكيف يقارن StringBuilder معهم؟ اسمحوا لي أن أقدمها بإيجاز أولاً. StringBuilder هي فئة تمت إضافتها حديثًا في JDK5.0. الفرق بينها وبين StringBuffer هو كما يلي (المصدر: JavaWorld):
Java.lang.StringBuffer تسلسل أحرف قابل للتغيير آمن. مخزن مؤقت لسلسلة يشبه String، لكن لا يمكن تعديله. يمكن استخدام المخازن المؤقتة للسلسلة بأمان بواسطة مؤشرات ترابط متعددة. يمكن مزامنة هذه الأساليب عند الضرورة، بحيث تظهر جميع العمليات على أي مثيل معين وكأنها تحدث بترتيب تسلسلي يتوافق مع ترتيب استدعاءات الأساليب التي يتم إجراؤها بواسطة كل مؤشر ترابط معني.
كل مخزن مؤقت للسلسلة له سعة معينة. طالما أن طول تسلسل الأحرف الموجود في المخزن المؤقت للسلسلة لا يتجاوز هذه السعة، ليست هناك حاجة لتخصيص مصفوفة مخزن مؤقت داخلي جديد. تتم زيادة هذه السعة تلقائيًا في حالة تجاوز سعة المخزن المؤقت الداخلي. بدءًا من JDK 5.0، تمت إضافة فئة مكافئة لاستخدام مؤشر ترابط واحد، StringBuilder، إلى هذه الفئة. يجب بشكل عام استخدام فئة StringBuilder بدلاً من هذه الفئة لأنها تدعم جميع العمليات نفسها ولكنها أسرع لأنها لا تقوم بالمزامنة.
ولكن من غير الآمن استخدام مثيل StringBuilder مع عدة سلاسل رسائل. إذا كانت هذه المزامنة مطلوبة، فمن المستحسن استخدام StringBuffer.
مع هذا، أعتقد أن الجميع يمكن أن يفهموا الفرق بينهما، لذلك دعونا نستنتج اشتقاقًا عامًا أدناه:
في معظم الحالات StringBuilder > StringBuffer
لذلك، وفقًا لنظرية نقل عدم المساواة هذه: في معظم الحالات StringBuilder > StringBuffer > String (كلما زاد عدد العمليات، كلما كان أكثر استقرارًا).
احصل على بداية طويلة للنظام = System.currentTimeMillis(); long end = System.currentTimeMillis(); لمعرفة قيمة المللي ثانية الجاري تشغيلها.
ل(i=0;i<str.length()/2;i++)
إذا (str.charAt(i)!=str.charAt(str.length()-i-1))
استراحة؛
إذا (i>=str.length()/2)
JOptionPane.showMessageDialog(null,"هي سلسلة متناظرة");
آخر
JOptionPane.showMessageDialog(null, "ليست سلسلة متناظرة");
}
}
*/
إذا (str.equals (str2))
JOptionPane.showMessageDialog(null,"هي سلسلة متناظرة");
آخر
JOptionPane.showMessageDialog(null, "ليست سلسلة متناظرة");
}
}