StringBuilder للضم الفعّال
استخدم StringBuilder لإنشاء السلاسل النصية بكفاءة داخل الحلقات وعمليات التنسيق المعقدة
StringBuilder للضم الفعّال درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
StringBuilder للدمج الفعّال
يمثل StringBuilder بديلًا قابلًا للتغيير عن String لإنشاء النص تدريجيًا. وهو يتجنب إنشاء عدد كبير من كائنات String الوسيطة.
StringBuilder مقابل دمج String
عند دمج العديد من السلاسل النصية، وخصوصًا داخل الحلقات، يكون StringBuilder أسرع بكثير لأنه يعدّل مخزن char داخليًا بدلًا من إنشاء كائنات جديدة.
// Inefficient: creates a new String every iteration
String result = "";
for (int i = 0; i < 1000; i++) {
result += i + ","; // 1000 new String objects!
}
// Efficient: StringBuilder uses a resizable char buffer
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i).append(',');
}
String efficient = sb.toString(); // one final String createdواجهة StringBuilder البرمجية
الأساليب الأساسية: append، insert، delete، replace، reverse، toString، length، charAt، setCharAt.
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World"); // Hello, World
sb.insert(5, "!"); // Hello!, World
sb.delete(5, 6); // Hello, World
sb.replace(7, 12, "Java"); // Hello, Java
sb.reverse(); // avaJ ,olleH
sb.reverse(); // Hello, Java
System.out.println(sb); // Hello, Java
System.out.println(sb.length()); // 11
System.out.println(sb.charAt(0)); // Hتسلسل استدعاءات append
تعيد جميع أساليب append وغيرها من الأساليب التي تعدّل الكائن this، مما يتيح التسلسل بأسلوب fluent.
StringBuilder html = new StringBuilder()
.append("<div class=\"card\">")
.append("<h2>").append("Product Title").append("</h2>")
.append("<p>Price: $").append(String.format("%.2f", 29.99)).append("</p>")
.append("<button>Add to Cart</button>")
.append("</div>");
System.out.println(html.toString());السعة الابتدائية
حدّدوا حجم StringBuilder مسبقًا باستخدام السعة المتوقعة لتجنب إعادة تحجيم المصفوفة الداخلية، مما يحسّن الأداء مع السلاسل النصية الكبيرة.
// Default capacity: 16 chars
StringBuilder small = new StringBuilder();
// Pre-sized: 10 items * ~50 chars each
StringBuilder report = new StringBuilder(500);
for (int i = 1; i <= 10; i++) {
report.append(String.format("%-3d. Record %04d: processed OK%n", i, i));
}
System.out.println(report.toString().substring(0, 30));
// " 1. Record 0001: processed OK"deleteCharAt وعمليات الحذف المحددة
يزيل deleteCharAt حرفًا واحدًا. ويزيل delete(start, end) نطاقًا من الأحرف. وتبلغ تكلفة هاتين العمليتين O(n) بسبب إزاحة عناصر المصفوفة.
StringBuilder sb = new StringBuilder("Hello, World!");
sb.deleteCharAt(5); // removes comma: "Hello World!"
sb.delete(5, 6); // removes space: "HelloWorld!"
System.out.println(sb); // HelloWorld!
// Replace to fix a typo
StringBuilder typo = new StringBuilder("Helo, Java!");
typo.replace(typo.indexOf("Helo"), typo.indexOf("Helo") + 4, "Hello");
System.out.println(typo); // Hello, Java!إنشاء CSV
نمط عملي: إنشاء سطر CSV باستخدام StringBuilder مع التعامل الصحيح مع الفواصل.
import java.util.List;
static String toCsv(List<String> values) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < values.size(); i++) {
if (i > 0) sb.append(',');
sb.append(escapeCsv(values.get(i)));
}
return sb.toString();
}
static String escapeCsv(String s) {
if (s.contains(",") || s.contains("\""))
return "\"" + s.replace("\"", "\"\"") + "\"";
return s;
}
System.out.println(toCsv(List.of("Alice", "Smith, Jr.", "30")));
// Alice,"Smith, Jr.",30StringJoiner لإخراج العناصر المفصولة بفاصل
تسهّل StringJoiner ضم العناصر باستخدام فاصل، مع بادئة ولاحقة اختياريتين، من دون الحاجة إلى التعامل اليدوي مع الفواصل.
import java.util.StringJoiner;
StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("Alice");
sj.add("Bob");
sj.add("Charlie");
System.out.println(sj.toString()); // [Alice, Bob, Charlie]
// Equivalent with String.join
String joined = String.join(", ", "Alice", "Bob", "Charlie");
System.out.println(joined); // Alice, Bob, Charlie
// Streams: collect with joining collector
import java.util.stream.*;
List.of("a", "b", "c").stream()
.collect(Collectors.joining(", ", "(", ")"));
// (a, b, c)StringBuilder مقابل StringBuffer
يمثل StringBuffer النسخة الآمنة للخيوط والمتزامنة من StringBuilder. وهو أبطأ بسبب الأقفال. استخدموا StringBuilder في السياقات أحادية الخيط، وهي 99% من الحالات.
// StringBuffer: thread-safe but slower (synchronized methods)
StringBuffer buf = new StringBuffer();
buf.append("Thread-safe");
buf.append(" but slow");
// StringBuilder: not thread-safe but faster
StringBuilder sb = new StringBuilder();
sb.append("Fast");
sb.append(" single-threaded");
// When to use StringBuffer:
// - Multiple threads write to the same buffer
// - Almost always a design smell — redesign to avoid sharingالعكس والتحقق من التماثل
يجعل الأسلوب المضمّن reverse() في StringBuilder التحقق من تماثل السلسلة النصية أنيقًا.
static boolean isPalindrome(String s) {
String cleaned = s.toLowerCase()
.replaceAll("[^a-z0-9]", ""); // remove non-alphanumeric
String reversed = new StringBuilder(cleaned).reverse().toString();
return cleaned.equals(reversed);
}
System.out.println(isPalindrome("A man, a plan, a canal: Panama")); // true
System.out.println(isPalindrome("race a car")); // false
System.out.println(isPalindrome("Was it a car or a cat I saw?")); // trueتطبيق عملي: منشئ استعلامات SQL
إنشاء استعلام SQL ديناميكي باستخدام StringBuilder، مع إضافة عبارات where بصورة شرطية.
static String buildQuery(String category, Double minPrice, Double maxPrice) {
StringBuilder sql = new StringBuilder("SELECT * FROM products WHERE 1=1");
if (category != null)
sql.append(" AND category = '" + category + "'");
if (minPrice != null)
sql.append(" AND price >= ").append(minPrice);
if (maxPrice != null)
sql.append(" AND price <= ").append(maxPrice);
sql.append(" ORDER BY name");
return sql.toString();
}
System.out.println(buildQuery("Electronics", 50.0, null));
// SELECT * FROM products WHERE 1=1 AND category = 'Electronics' AND price >= 50.0 ORDER BY nameتحقق سريع
لماذا يكون دمج السلاسل النصية باستخدام + غير فعّال داخل الحلقات؟
مراجعة: StringBuilder للدمج الفعّال
أهم النقاط:
- StringBuilder قابل للتغيير؛ إذ تعدّل أساليب append وinsert وdelete مخزنًا داخليًا
- استخدموا StringBuilder داخل الحلقات لتجنب إنشاء السلاسل النصية بتعقيد O(n²)
- تعيد جميع الأساليب التي تعدّل الكائن this، مما يتيح التسلسل بأسلوب fluent
- حدّدوا سعة StringBuilder مسبقًا باستخدام السعة المتوقعة لتقليل إعادة التحجيم الداخلية
- يُعد StringJoiner وString.join مناسبين لإخراج العناصر المفصولة بفاصل
- يمثل StringBuffer البديل المتزامن والآمن للخيوط، لكنه أبطأ
الأسئلة الشائعة
هل درس «StringBuilder للضم الفعّال» مجاني؟
نعم — نص درس «StringBuilder للضم الفعّال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «StringBuilder للضم الفعّال»؟
استخدم StringBuilder لإنشاء السلاسل النصية بكفاءة داخل الحلقات وعمليات التنسيق المعقدة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «StringBuilder للضم الفعّال»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عدم قابلية String للتغيير ومجمّع السلاسل النصية
- StringBuilder للضم الفعّال
- كتل النص وString.format
- التعابير النمطية باستخدام Pattern وMatcher