StringBuilder

StringBuilder هو فئة قابلة للتغيير لبناء النصوص. في هذا الدرس، سنتعلم كيفية استخدامه.

لماذا StringBuilder؟

String غير قابلة للتغيير — أي تعديل يُنشئ نصًا جديدًا:

JAVA
String text = "";
for (int i = 0; i < 1000; i++) {
    text += i;  // يُنشئ 1000 كائن String — غير فعال!
}

StringBuilder يُعدّل النص في نفس الكائن:

JAVA
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i);  // يُعدّل نفس الكائن — فعال!
}
String result = sb.toString();

إنشاء StringBuilder

JAVA
// فارغ
StringBuilder sb1 = new StringBuilder();

// بقيمة أولية
StringBuilder sb2 = new StringBuilder("مرحباً");

// بسعة محددة
StringBuilder sb3 = new StringBuilder(100);

العمليات الأساسية

append — إضافة

JAVA
StringBuilder sb = new StringBuilder("مرحباً");
sb.append(" ");          // "مرحباً "
sb.append("بالعالم");    // "مرحباً بالعالم"
sb.append("!");          // "مرحباً بالعالم!"

String result = sb.toString();  // "مرحباً بالعالم!"

insert — إدراج

JAVA
StringBuilder sb = new StringBuilder("مرحباً بالعالم");
sb.insert(7, "عزيز ");  // "مرحباً عزيز بالعالم"

delete — حذف

JAVA
StringBuilder sb = new StringBuilder("مرحباً بالعالم");
sb.delete(6, 13);  // "مرحباً"

replace — استبدال

JAVA
StringBuilder sb = new StringBuilder("مرحباً بالعالم");
sb.replace(7, 12, "Java");  // "مرحباً بJava"

reverse — عكس

JAVA
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();  // "olleH"

charAt و indexOf

JAVA
StringBuilder sb = new StringBuilder("مرحباً");

char ch = sb.charAt(0);  // 'م'
int pos = sb.indexOf("حباً");  // 2

مقارنة String و StringBuilder

الميزة String StringBuilder
قابلية التغيير Immutable Mutable
الأداء (تعديلات كثيرة) بطيء سريع
الأمان (خيوط) آمن غير آمن
الاستخدام نصوص ثابتة بناء نصوص ديناميكي

أمثلة عملية

بناء CSV

JAVA
public static String buildCSV(String[] items) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < items.length; i++) {
        sb.append(items[i]);
        if (i < items.length - 1) {
            sb.append(",");
        }
    }
    return sb.toString();
}

String csv = buildCSV(new String[]{"أحمد", "محمد", "علي"});
// "أحمد,محمد,علي"

بناء HTML

JAVA
public static String buildList(String[] items) {
    StringBuilder sb = new StringBuilder("<ul>\n");
    for (String item : items) {
        sb.append("  <li>").append(item).append("</li>\n");
    }
    sb.append("</ul>");
    return sb.toString();
}

بناء SQL

JAVA
public static String buildQuery(String table, String[] columns, String condition) {
    StringBuilder sb = new StringBuilder("SELECT ");
    for (int i = 0; i < columns.length; i++) {
        sb.append(columns[i]);
        if (i < columns.length - 1) sb.append(", ");
    }
    sb.append(" FROM ").append(table);
    if (condition != null && !condition.isEmpty()) {
        sb.append(" WHERE ").append(condition);
    }
    return sb.toString();
}

String query = buildQuery("users", new String[]{"id", "name", "age"}, "age > 18");
// "SELECT id, name, age FROM users WHERE age > 18"

StringBuffer

StringBuffer هو نسخة متزامنة (thread-safe) من StringBuilder:

JAVA
StringBuffer sb = new StringBuffer("مرحباً");
sb.append(" بالعالم");
StringBuilder StringBuffer
غير متزامن متزامن
أسرع أبطأ
لخيط واحد لعدة خيوط

❓ أسئلة شائعة

س متى أستخدم String ومتى أستخدم StringBuilder؟
ج استخدم String عندما لا تُعدّل النص كثيرًا. استخدم StringBuilder عندما تحتاج إلى تعديلات متكررة.
س لماذا StringBuilder غير آمن للخيوط؟
ج لأنه لا يُزامن (synchronized). إذا كنت تعمل مع عدة خيوط، استخدم StringBuffer.
س هل يمكن تحويل StringBuilder إلى String؟
ج نعم، باستخدام toString().

📖 ملخص

📝 تمارين

  1. بناء نص: استخدم StringBuilder لبناء نص من 100 رقم مفصول بفاصلة
  2. عكس النص: اكتب دالة تعكس نصًا باستخدام StringBuilder
  3. إزالة التكرار: اكتب دالة تزيل الأحرف المتتالية المكررة (مثل "aabbcc" → "abc")

الدرس التالي

في الدرس التالي، سنتعلم الدوال المدمجة للنصوص — Math و التاريخ.

100%