1 سلسلة
السلسلة: سلسلة ثابتة ، طول السلسلة غير قابل للتغيير.
2 StringBuffer
StringBuffer: متغير سلسلة (متزامن ، أي آمن مؤشر ترابط). إذا كنت ترغب في تعديل محتوى السلسلة بشكل متكرر ، فمن الأفضل استخدام StringBuffer لأسباب الكفاءة. إذا كنت ترغب في التحويل إلى نوع السلسلة ، فيمكنك استدعاء طريقة ToString () من StringBuffer.
Java.lang.StringBuffer Safe-Safe Sequence Formence. أنه يحتوي على سلسلة معينة من الأحرف في أي وقت من الأوقات ، ولكن يمكن تغيير طول ومحتوى التسلسل من خلال بعض مكالمات الطريقة. يمكن استخدام المخازن المؤقتة السلسلة بأمان لخيوط متعددة.
العمليات الرئيسية على StringBuffer هي طرق الإلحاق والإدراج ، والتي يمكن أن تكون مثقلة لقبول أي نوع من البيانات. يمكن لكل طريقة تحويل البيانات المحددة بشكل فعال إلى سلسلة ، ثم إلحاق أو إدراج أحرف السلسلة في المخزن المؤقت للسلسلة. تضيف طريقة إلحاق هذه الأحرف دائمًا إلى نهاية المخزن المؤقت ؛ تضيف طريقة إدراج الأحرف في النقطة المحددة. على سبيل المثال ، إذا كانت Z تشير إلى كائن مخزن مؤقت للسلسلة ، فإن المحتوى الحالي "START" ، فإن هذه الطريقة استدعاء Z.Append ("LE") تجعل المخزن المؤقت للسلسلة يحتوي على "Stridle" ، و Z.Insert (4 ، "LE") يغير المخزن المؤقت للسلسلة لاحتواء "Starlet".
3 StringBuilder
StringBuilder: سلسلة متغير (غير آمن غير تراكم).
Java.lang.StringBuilder هو تسلسل حرف متغير يتم إضافته حديثًا إلى JDK5.0. يوفر هذا الفئة واجهة برمجة تطبيقات متوافقة مع StringBuffer ، ولكن ليس مضمونًا للمزامنة. تم تصميم هذه الفئة لتكون بديلاً بسيطًا لـ StringBuffer ، عند استخدام المخازن المؤقتة للسلسلة بواسطة مؤشر ترابط واحد (هذا أمر شائع). إذا كان ذلك ممكنًا ، فمن المستحسن أخذ هذه الفئة أولاً ، لأنه في معظم التطبيقات أسرع من StringBuffer. أساليب كليهما هي نفسها بشكل أساسي.
في معظم الحالات ، StringBuilder> StringBuffer.
4 الفرق بين الثلاثة
فرق الأداء الرئيسي بين نوع السلسلة و stringbuffer: السلسلة هي كائن غير قابل للتغيير. لذلك ، في كل مرة يتم تغيير نوع السلسلة ، سيتم إنشاء كائن سلسلة جديد ، ثم يتم توجيه المؤشر إلى كائن سلسلة جديد. لذلك ، من الأفضل عدم استخدام سلسلة للسلاسل التي غالباً ما تغير المحتوى ، لأنه في كل مرة يتم فيها إنشاء الكائن ، سيكون له تأثير على أداء النظام ، خاصة عندما يكون هناك الكثير من الكائنات المرجعية في الذاكرة ، وسيبدأ GC في JVM العمل وسيتم تدهور الأداء.
عند استخدام فئة StringBuffer ، يتم تشغيل كائن StringBuffer نفسه في كل مرة بدلاً من إنشاء كائن جديد وتغيير مرجع الكائن. لذلك ، في معظم الحالات ، يوصى بـ StringBuffer ، خاصةً عندما يتم تغيير كائنات السلسلة.
في بعض الحالات الخاصة ، يتم تفسير الربط السلسلة لكائن السلسلة فعليًا بواسطة JVM كربط لكائن StringBuffer ، وبالتالي فإن سرعة كائن السلسلة ليست أبطأ من كائن StringBuffer في هذه الأوقات ، على سبيل المثال:
String S1 = "هذا ليس سوى" + "بسيط" + "اختبار" ؛ StringBuffer SB = New StringBuilder ("هذه ليست سوى"). إلحاق ("بسيط"). إلحاق ("اختبار") ؛ توليد كائنات S1 S1 ليست أبطأ من StringBuffer. في الواقع ، في JVM ، يتم إجراء التحويل التالي تلقائيًا:
String S1 = "هذا ليس سوى" + "بسيط" + "اختبار" ؛
يعامل JVM مباشرة البيان أعلاه على النحو التالي:
السلسلة S1 = "هذا مجرد اختبار بسيط" ؛
لذلك السرعة سريعة جدا. ولكن تجدر الإشارة إلى أنه إذا جاءت السلسلة المقسمة من كائن سلسلة آخر ، فلن يتم تحويل JVM تلقائيًا ، ولن تكون السرعة بهذه السرعة ، على سبيل المثال:
String S2 = "This is is A" ؛ String S3 = "Simple" ؛ String S4 = "Test" ؛ String S1 = S2 + S3 + S4 ؛
في هذا الوقت ، ستقوم JVM بذلك بطريقة منتظمة بالطريقة الأصلية.
في معظم الحالات ، StringBuffer> String.
4.StringBuffer و StringBuilder
لا يوجد فرق تقريبًا بين الاثنين. إنهم يطلقون بشكل أساسي على طرق مختلفة لفئة الوالدين. هناك اختلاف مهم هو أن StringBuffer آمن مؤشر الترابط. تحتوي معظم الطرق الداخلية على الكلمة الرئيسية متزامنة قبلها ، مما سيؤدي إلى استهلاك معين للأداء. StringBuilder غير آمن ، لذلك فهو أكثر كفاءة.
static static void main (string [] args) يلقي الاستثناء {String string = "0" ؛ int n = 10000 ؛ begin long = system.currentTimeMillis () ؛ لـ (int i = 1 ؛ i <n ؛ i ++) {string+= i ؛ } نهاية طويلة = system.currentTimeMillis () ؛ طويل بين = نهاية - ابدأ ؛ System.out.println ("الوقت المستهلك باستخدام فئة السلسلة:" + بين + "MS") ؛ int n1 = 10000 ؛ StringBuffer SB = New StringBuffer ("0") ؛ begin1 = system.currentTimeMillis () ؛ لـ (int j = 1 ؛ j <n1 ؛ j ++) {sb.append (j) ؛ } end1 = system.currentTimeMillis () ؛ طويل بين 1 = end1 - start1 ؛ System.out.println ("يستهلك الوقت باستخدام فئة StringBuffer:" + inter1 + "MS") ؛ int n2 = 10000 ؛ StringBuilder SB2 = New StringBuilder ("0") ؛ begin2 = system.currentTimeMillis () ؛ لـ (int k = 1 ؛ k <n2 ؛ k ++) {sb2.append (k) ؛ } end2 = system.currentTimeMillis () ؛ طويل بين 2 = end2 - start2 ؛ System.out.println ("يستهلك الوقت لاستخدام فئة StringBuilder:" + inter2 + "MS") ؛ } الإخراج:
حان الوقت لاستخدام فئة السلسلة: 982ms الوقت لاستخدام StringBuffer Class: 2ms الوقت لاستخدام StringBuilder Class: 1ms
على الرغم من أن هذا الرقم مختلف في كل مرة ، وموقف كل جهاز مختلف ، هناك عدة نقاط مؤكدة ، وتستهلك فئة السلسلة أكثر بكثير من الاثنين الآخرين. نقطة أخرى هي أن StringBuffer يستهلك أكثر من StringBuilder ، على الرغم من أن الفرق غير واضح.
5 استراتيجيات الاستخدام
(1) المبادئ الأساسية: إذا كنت ترغب في تشغيل كمية صغيرة من البيانات ، استخدم سلسلة ؛ إذا قمت بتشغيل كمية كبيرة من البيانات مع مؤشر ترابط واحد ، فاستخدم StringBuilder ؛ إذا قمت بتشغيل كمية كبيرة من البيانات باستخدام Trathread ، فاستخدم StringBuffer.
(2) لا تستخدم "+" لفئة السلسلة للربط المتكرر ، لأنه إذا كان الأداء ضعيفًا للغاية ، فيجب عليك استخدام فئة StringBuffer أو StringBuilder ، وهو مبدأ مهم نسبيًا في تحسين Java. على سبيل المثال: عند استخدام السلسلة ، عند الربط بين السلاسل ، استخدم "+" لتشكيل كائن StringBuffer مؤقت على JVM ، وفي نفس الوقت ، يتم إنشاء كائن على كل سلسلة. بعد ربط سلسلتين ، هناك حاجة إلى إنشاء ما مجموعه 4 كائنات! (سلسلة تحمل النتيجة ، كائنين سلسلة ، وكائن StringBuffer مؤقت). إذا كنت تستخدم StringBuffer ، فأنت بحاجة فقط إلى إنشاء كائنين! كائن StringBuffer وكائن السلسلة الذي يحمل النتيجة الأخيرة.
(3) لتحسين الأداء ، يجب تحديد قدرتها قدر الإمكان عند بناء aristngbuffer أو aristngbuilder. بالطبع ، إذا كانت السلسلة التي تديرها لا تتجاوز طولها 16 حرفًا ، فلن تحتاج إليها. عدم تحديد السعة سيقلل بشكل كبير من الأداء.
(4) يتم استخدام StringBuilder بشكل عام داخل الطريقة لإكمال وظائف "+" مماثلة. لأن ؟ هو آمن الخيط ، يمكن التخلص منه بعد الاستخدام. يستخدم StringBuffer بشكل أساسي في المتغيرات العالمية.
(5) يمكن أن يحقق استخدام aristngbuilder في نفس الموقف فقط تحسين الأداء بنسبة 10 ٪ ~ 15 ٪ مقارنة باستخدام StringBuffer ، ولكنه يتطلب خطر عدم الأمان متعدد الخيوط. في البرمجة المعيارية الحقيقية ، قد لا يتمكن المبرمج المسؤول عن وحدة معينة من تحديد ما إذا كانت الوحدة سيتم وضعها في بيئة متعددة الخيوط بوضوح. لذلك ، لا يمكن استخدام StringBuilder إلا ما لم تكن متأكدًا من أن عنق الزجاجة في النظام موجود على StringBuffer وأنك متأكد من أن الوحدة النمطية لن تعمل في وضع متعدد الخيوط ؛ خلاف ذلك ، لا يزال stringbuffer يستخدم.