في Java، عند العمل مع سلاسل قابلة للتغيير (سلاسل يمكن تعديلها)، قد تحتاج إلى الاختيار بين StringBuilder وStringBuffer. في حين أن كلاهما فئات قابلة للتغيير تسمح بتعديل قيمها، إلا أنها تختلف بشكل كبير من حيث أمان الخيط والأداء والتطبيق. هنا، سنقوم بمقارنة خصائصها وتقديم أمثلة التعليمات البرمجية لتوضيح متى يتم استخدام كل منها.
ميزة | منشئ السلاسل | StringBuffer |
---|---|---|
التحولية | متقلب | متقلب |
مخزنة في | الكومة (لا تستخدم مجموعة السلاسل) | الكومة (لا تستخدم مجموعة السلاسل) |
سلامة الخيط | غير آمن للخيط | خيط آمن |
التزامن | غير متزامنة | متزامنة |
أداء | أسرع بسبب عدم المزامنة | أبطأ بسبب حمل المزامنة |
حالة الاستخدام | سيناريوهات ذات ترابط واحد | سيناريوهات متعددة الخيوط حيث تكون سلامة الخيوط مطلوبة |
دعونا نستكشف كل فصل بمزيد من التفاصيل.
StringBuilder هي فئة قابلة للتغيير، مما يعني أنها تسمح بإجراء تعديلات على محتواها.
إنها سلسلة المحادثات غير آمنة، لذا فهي مثالية لسيناريوهات سلسلة المحادثات الفردية.
غير متزامن: StringBuilder أسرع من StringBuffer بسبب عدم وجود حمل للمزامنة.
قيود متعددة الخيوط : يمكن أن يؤدي استخدام StringBuilder في بيئات متعددة الخيوط دون تدابير أمان إضافية إلى ظروف السباق ومشكلات التزامن الأخرى.
في هذا المثال، نستخدم خيطين لإلحاق الأحرف بمثيل StringBuilder. ومع ذلك، بسبب عدم وجود مزامنة، نواجه ظروف السباق:
public class StringBuilderBasics { public void threadUnsafe() { // Common resource being shared StringBuilder builder = new StringBuilder(); // Thread appending "A" 1000 times Thread t1 = new Thread(() -> { for (int i = 0; i { for (int i = 0; iتوضيح:
بسبب عدم أمان الخيط، لا يمكن التنبؤ بالطول النهائي لمخرجات StringBuilder (على سبيل المثال، 1840 بدلاً من 2000).
يحدث هذا لأن كلا الخيطين يحاولان إلحاق الأحرف في وقت واحد، مما يؤدي إلى الكتابة فوق أو العمليات المسقطة.
الوجبات الجاهزة: استخدم StringBuilder فقط في البيئات ذات الخيوط المفردة أو عندما يتم التعامل مع سلامة الخيوط خارجيًا.
StringBuffer هو قابل للتغيير، مما يسمح بإجراء تعديلات على محتواه.
إنها متزامنة، مما يجعلها آمنة لمؤشر الترابط.
مثالي لبيئات متعددة الخيوط حيث تكون سلامة الخيوط ضرورية.
تكلفة الأداء : تؤدي المزامنة إلى زيادة الحمل، لذا فإن StringBuffer أبطأ من StringBuilder.
إليك نفس المثال المذكور أعلاه، ولكن هذه المرة باستخدام StringBuffer:
public class StringBufferBasics { public void threadSafe() { // Common resource being shared StringBuffer buffer = new StringBuffer(); // Thread appending "A" 1000 times Thread t1 = new Thread(() -> { for (int i = 0; i { for (int i = 0; iتوضيح:
يضمن StringBuffer إلحاق كلا الخيطين بأمان، مما يحقق الطول المتوقع وهو 2000.
على الرغم من أن السلسلة النهائية آمنة للخيط، إلا أن الإخراج قد يكون معشقًا (على سبيل المثال، "AAABBB..." مختلطًا معًا) حيث أن ترتيب تنفيذ الخيط هو غير حتمي.
الوجبات الجاهزة: استخدم StringBuffer للتطبيقات متعددة الخيوط حيث يكون تناسق البيانات أمرًا بالغ الأهمية والمزامنة مطلوبة.
للاختيار بين StringBuilder وStringBuffer، ضع في اعتبارك ما يلي:
استخدم StringBuilder في سيناريوهات ذات ترابط واحد حيث يكون الأداء أمرًا بالغ الأهمية ولا تشكل سلامة الخيط مصدر قلق.
استخدم StringBuffer في سيناريوهات متعددة الخيوط حيث تحتاج إلى عمليات سلسلة قابلة للتغيير وتتطلب سلامة الخيط لتجنب حالات السباق.
من المفترض أن تساعدك هذه المقارنة على اتخاذ قرار مستنير بين StringBuilder وStringBuffer. يمكن أن يؤدي فهم المفاضلات في قابلية التغيير والأداء وسلامة الخيوط إلى اتخاذ قرارات أفضل عند العمل مع السلاسل في Java.
تعليمات سعيدة!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3