StringBuilder مقابل StringBuffer
مفاضلات أمان الخيوط
StringBuilder مقابل StringBuffer درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
فئتان قابلتان للتغيير
تحتوي Java على فئتين للسلاسل النصية القابلة للتغيير: StringBuilder وStringBuffer. وواجهتا البرمجة متطابقتان تقريبًا، لكنهما تختلفان في نقطة أساسية واحدة: الأمان مع الخيوط.
واجهة API نفسها
توفر كلتا الفئتين append وinsert وdelete وreverse وغير ذلك. ويمكن عادةً تبديل الكود الذي يستخدم إحداهما بالأخرى من خلال تغيير اسم النوع فقط.
public class Main {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello").append(", ").append("World");
System.out.println(sb);
}
}StringBuffer متزامن
تُعد أساليب StringBuffer متزامنة، ما يعني أن خيوطًا متعددة يمكنها تعديل المثيل نفسه بأمان. وتأتي هذه الحماية بتكلفة صغيرة في الأداء.
public class Main {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer("thread-safe");
buffer.append("!");
System.out.println(buffer);
}
}StringBuilder غير متزامن
يتجاوز StringBuilder المزامنة، مما يجعله أسرع. والمقابل هو أنه لا يكون آمنًا لمشاركة مثيل واحد بين الخيوط من دون تنسيق خارجي.
public class Main {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("fast");
builder.append("!");
System.out.println(builder);
}
}متى تستخدم StringBuilder
استخدموا StringBuilder في الحالة الشائعة: عند إنشاء السلاسل النصية داخل أسلوب واحد أو خيط واحد. وهو الخيار الافتراضي في معظم الأكواد اليومية.
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
sb.append("#");
}
System.out.println(sb);
}
}متى تستخدم StringBuffer
استخدموا StringBuffer فقط عندما يكون المثيل نفسه مشتركًا فعلًا ويُعدّل بواسطة خيوط متعددة. وهذا نادر عمليًا.
public class Main {
public static void main(String[] args) {
StringBuffer shared = new StringBuffer("log: ");
shared.append("event A; ");
shared.append("event B");
System.out.println(shared);
}
}المتغيرات المحلية غير مشتركة
إن أداة البناء المُعلَن عنها والمستخدمة داخل أسلوب واحد فقط لا تكون مرئية للخيوط الأخرى مطلقًا، لذلك يكون استخدام StringBuilder صحيحًا دائمًا في هذه الحالة. ولا يمكن لغياب المزامنة أن يسبب مشكلة.
public class Main {
static String build() {
StringBuilder sb = new StringBuilder();
sb.append("local only");
return sb.toString();
}
public static void main(String[] args) {
System.out.println(build());
}
}فرق الأداء
تجعل كلفة المزامنة في StringBuffer أداءه أبطأ عند الاستخدام في خيط واحد. وفي الحلقات المكثفة، يحقق StringBuilder أداءً أفضل.
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append('x');
}
System.out.println("Built length: " + sb.length());
}
}ملاحظة تاريخية
ظهر StringBuffer أولًا في بدايات Java. وأُضيف StringBuilder في Java 5 بوصفه البديل الأسرع غير المتزامن للحالة الشائعة التي تستخدم خيطًا واحدًا.
الاختيار الصحيح
اجعل StringBuilder الخيار الافتراضي. ولا تنتقل إلى StringBuffer إلا عند إثبات أن مثيلًا واحدًا مشترك بين الخيوط. وإلا فستتحمل كلفة أمان لا تحتاج إليها.
public class Main {
public static void main(String[] args) {
StringBuilder result = new StringBuilder();
result.append("Use StringBuilder ").append("by default");
System.out.println(result);
}
}كلاهما يحوّل إلى String
ينتج أيٌّ من الصنفين كائن String غير قابل للتغيير من خلال toString(). ويؤثر الاختيار بينهما في عملية البناء فقط، لا في النتيجة النهائية.
public class Main {
public static void main(String[] args) {
String a = new StringBuilder("one").toString();
String b = new StringBuffer("two").toString();
System.out.println(a + " " + b);
}
}تحقق سريع
ما الفرق الرئيسي بين StringBuilder وStringBuffer؟
خلاصة
لقد تعلمت المفاضلات التالية:
- كلاهما يملك واجهتي برمجة متطابقتين تقريبًا
StringBufferمتزامن (آمن للخيوط وأبطأ)StringBuilderغير متزامن (أسرع)- اجعل
StringBuilderالخيار الافتراضي للبناء في خيط واحد - استخدم
StringBufferفقط للمثيلات المشتركة فعلًا
الأسئلة الشائعة
هل درس «StringBuilder مقابل StringBuffer» مجاني؟
نعم — نص درس «StringBuilder مقابل StringBuffer» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «StringBuilder مقابل StringBuffer»؟
مفاضلات أمان الخيوط تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «StringBuilder مقابل StringBuffer»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا تكون السلاسل غير قابلة للتغيير
- بناء السلاسل باستخدام StringBuilder
- طرائق StringBuilder
- StringBuilder مقابل StringBuffer