"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > StringBuilder vs StringBuffer في جافا

StringBuilder vs StringBuffer في جافا

تم النشر بتاريخ 2024-11-21
تصفح:542

StringBuilder vs StringBuffer in Java

في Java، عند العمل مع سلاسل قابلة للتغيير (سلاسل يمكن تعديلها)، قد تحتاج إلى الاختيار بين StringBuilder وStringBuffer. في حين أن كلاهما فئات قابلة للتغيير تسمح بتعديل قيمها، إلا أنها تختلف بشكل كبير من حيث أمان الخيط والأداء والتطبيق. هنا، سنقوم بمقارنة خصائصها وتقديم أمثلة التعليمات البرمجية لتوضيح متى يتم استخدام كل منها.


الاختلافات الرئيسية: StringBuilder وStringBuffer

ميزة منشئ السلاسل StringBuffer
التحولية متقلب متقلب
مخزنة في الكومة (لا تستخدم مجموعة السلاسل) الكومة (لا تستخدم مجموعة السلاسل)
سلامة الخيط غير آمن للخيط خيط آمن
التزامن غير متزامنة متزامنة
أداء أسرع بسبب عدم المزامنة أبطأ بسبب حمل المزامنة
حالة الاستخدام سيناريوهات ذات ترابط واحد سيناريوهات متعددة الخيوط حيث تكون سلامة الخيوط مطلوبة

دعونا نستكشف كل فصل بمزيد من التفاصيل.


1. StringBuilder: الاختيار الفعال للبيئات ذات الترابط الواحد

  • StringBuilder هي فئة قابلة للتغيير، مما يعني أنها تسمح بإجراء تعديلات على محتواها.

  • إنها سلسلة المحادثات غير آمنة، لذا فهي مثالية لسيناريوهات سلسلة المحادثات الفردية.

  • غير متزامن: StringBuilder أسرع من StringBuffer بسبب عدم وجود حمل للمزامنة.

  • قيود متعددة الخيوط : يمكن أن يؤدي استخدام StringBuilder في بيئات متعددة الخيوط دون تدابير أمان إضافية إلى ظروف السباق ومشكلات التزامن الأخرى.

مثال: إظهار عدم أمان مؤشر الترابط في 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 فقط في البيئات ذات الخيوط المفردة أو عندما يتم التعامل مع سلامة الخيوط خارجيًا.


2. StringBuffer: الخيار الآمن للبيئات متعددة الخيوط

  • StringBuffer هو قابل للتغيير، مما يسمح بإجراء تعديلات على محتواه.

  • إنها متزامنة، مما يجعلها آمنة لمؤشر الترابط.

  • مثالي لبيئات متعددة الخيوط حيث تكون سلامة الخيوط ضرورية.

  • تكلفة الأداء : تؤدي المزامنة إلى زيادة الحمل، لذا فإن StringBuffer أبطأ من StringBuilder.

مثال: سلامة الخيط في StringBuffer

إليك نفس المثال المذكور أعلاه، ولكن هذه المرة باستخدام 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.


المشاركات ذات الصلة

  • أساسيات جافا
  • أساسيات مقابلة المصفوفة
  • أساسيات ذاكرة جافا
  • أساسيات الكلمات الرئيسية لجافا
  • أساسيات Java OOPs
  • أساسيات إطار عمل المجموعات

تعليمات سعيدة!

بيان الافراج تم استنساخ هذه المقالة في: https://dev.to/arshisaxen26/stringbuilder-vs-shringbuffer-iva-4jlb؟
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3