18
  • الاختلاف الرئيسي بين String و StringBuilder هو أن String يعتبر immutable، بينما StringBuilder هو mutable. وهذا يعني بأنه عند إنشاء كائن من String في الذاكرة، لا يمكن تعديل المحتوى النصي لهذا الكائن، بعكس الـ StringBuilder.

    • بالنسبة للـ concatenation operator مثل: "Hello " + "World" فهي لا تعني التعديل على كائن String معين، ولكن تتم ترجمتها أثناء الـ compile-time إلى:
String s = new StringBuilder("Hello ").append("world").toString();

والطريقة قد تختلف من implementation إلى آخر للـ JDK.

  • يتميز الـ String بأنه من الممكن إنشاء كائن منه عن طريق الـ String literal، مثل: "أهلاً بالعالم".

  • الـ APIs الخاصة بالـ String تحتلف عن الـ APIs الخاصة بالـ StringBuilder.

  • للتحويل من String إلى StringBuilder، استخدم الـ constructor. بينما العكس يتم عن طريق الدالة toString.

شكرا لك استاذنا العزيز

اضافه صغيرة لما ذُكر فإنه بالرغم من فوائد ال Immutability في النصوص String ، فعليك ان تعرف امرين أخرين متعلق به

الأول من ناحية الأداء Performance:

حيث لا يمكنك التعديل على الكائن وانما يتم انشاء كائن جديد بالقيمة القديمة مع الجديدة ، فلذلك الأمر يفضل أن تستخدم ال StringBuilder عندما تريد عمل Concatenation لأكثر من String مثلاً 10 الف مرة حيث أن أدائها أفضل

[code]

private String getReport(List data) {

String result = "";

for(Data d: data) {

result += getRow(d);

}

return result;

}

[/code]

مثل هذه الحالة فيفضل ان تستخدم StringBuilder وتبنى نصك وترجعه كString باستخدام toString .

النقطة الثانية وهي في ال Security:

فيفضل أن لا تخزن الأرقام الحساسه كString في برنامجك:

String password = anyInputReader.getString(); // joke object

لماذا ؟ السبب أن الكائن الـ Immutable لا يتغير وسوف تكون قيمته محفوظة الا أن يقوم ال GC بالتعامل مع هذه الذاكرة وتحرريها عندما ينتهي الكائن ، والأفضل أن تخزنها ك Array of Char وقم بتصفيرها متى ما انتهيت منها..

char[] password = Console.readPassword();

// do your checking

Arrays.fill(password, '');

جافا - Java

مجتمع مطوري لغة جافا

2.49 ألف متابع