1. أولاً، السلسلة لا تنتمي إلى أنواع البيانات الثمانية الأساسية.
نظرًا لأن القيمة الافتراضية للكائن خالية، فإن القيمة الافتراضية للسلسلة هي أيضًا فارغة؛ ولكنها كائن خاص ولها بعض الخصائص التي لا تمتلكها الكائنات الأخرى.
2. تعلن كل من السلسلة الجديدة () والسلسلة الجديدة ("") عن سلسلة فارغة جديدة، وهي سلسلة فارغة وليست فارغة؛
3.String str = "kvill"؛
الفرق بين String str=new String ("kvill")؛:
لن نتحدث هنا عن الكومة أو المكدس، بل سنقدم ببساطة المفهوم البسيط للتجميع الثابت.
يشير التجمع الثابت إلى التجمع الذي تم تحديده في وقت الترجمة وتخزينه في التجمع المترجم. بعض البيانات في ملف الفصل. ويتضمن ثوابت في الفئات والأساليب والواجهات وما إلى ذلك، بالإضافة إلى ثوابت السلسلة.
انظر إلى المثال 1:
انسخ رمز الكود كما يلي:
سلسلة s0 = "كفيل"؛
سلسلة s1 = "كفيل"؛
سلسلة s2 = "kv" + "سوء"؛
System.out.println( s0==s1 );
System.out.println( s0==s2 );
والنتيجة هي:
حقيقي
حقيقي
أولاً، نحتاج إلى معرفة أن Java ستضمن وجود نسخة واحدة فقط من ثابت السلسلة.
نظرًا لأن "kvill" في s0 وs1 في المثال عبارة عن ثوابت سلسلة، يتم تحديدهما في وقت الترجمة، لذا فإن s0==s1 صحيحة و"kv" و"ill" هما أيضًا ثوابت سلسلة، عندما تكون السلسلة متسلسلة بواسطة ثوابت سلسلة متعددة، يجب أن تكون في حد ذاتها ثابتة سلسلة، لذلك يتم تحليل s2 أيضًا إلى ثابت سلسلة في وقت الترجمة، لذا فإن s2 هي أيضًا واحدة من "kvill" في اقتباس التجمع الثابت.
لذلك نحصل على s0==s1==s2؛
السلاسل التي تم إنشاؤها باستخدام String() الجديدة ليست ثوابت ولا يمكن تحديدها في وقت الترجمة، لذلك لا يتم وضع السلاسل التي تم إنشاؤها باستخدام String() الجديدة في التجمع الثابت، ولديها مساحة عنوان خاصة بها.
انظر إلى المثال 2:
انسخ رمز الكود كما يلي:
سلسلة s0 = "كفيل"؛
String s1=new String("kvill");
String s2="kv" + new String("ill");
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
والنتيجة هي:
خطأ شنيع
خطأ شنيع
خطأ شنيع
في المثال 2، لا يزال s0 هو تطبيق "kvill" في التجمع الثابت، نظرًا لأنه لا يمكن تحديد s1 في وقت الترجمة، فهو مرجع إلى الكائن الجديد "kvill" الذي تم إنشاؤه في وقت التشغيل، نظرًا لأن s2 يحتوي على النصف الثاني من newString ("سوء")، لا يمكن تحديده أيضًا في وقت الترجمة، لذا فهو أيضًا تطبيق لكائن تم إنشاؤه حديثًا "kvill" إذا فهمت ذلك، فستعرف سبب الحصول على هذه النتيجة.
4. سلسلة.intern ():
اسمحوا لي أن أضيف نقطة أخرى: موجود في. يتم تحميل التجمع الثابت في ملف الفئة بواسطة JVM أثناء وقت التشغيل ويمكن توسيعه. طريقة intern() الخاصة بالسلسلة هي طريقة لتوسيع التجمع الثابت؛ عندما تستدعي سلسلة مثيل String طريقة intern()، تتحقق Java مما إذا كان هناك ثابت سلسلة بنفس Unicode في التجمع الثابت إذا لم يكن الأمر كذلك، أضف سلسلة Unicode مساوية لـ str في التجمع الثابت وأعد مرجعها؛ سيكون واضحًا من خلال النظر إلى المثال 3. المثال 3:
انسخ رمز الكود كما يلي:
سلسلة s0= "كفيل";
String s1=new String("kvill");
String s2=new String("kvill");
System.out.println( s0==s1 );
System.out.println( "**********");
s1.intern();
s2=s2.intern(); // قم بتعيين مرجع "kvill" في التجمع الثابت إلى s2
System.out.println(s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
والنتيجة هي:
خطأ شنيع
**********
خطأ // على الرغم من تنفيذ s1.intern()، لم يتم تعيين قيمة الإرجاع الخاصة به إلى s1
صحيح // يشير إلى أن s1.intern() يُرجع مرجعًا إلى "kvill" في التجمع الثابت
حقيقي
وأخيرا، اسمحوا لي أن أبدد سوء فهم آخر:
قال أحدهم، "استخدم طريقة String.intern() لحفظ فئة سلسلة في جدول سلسلة عالمي. إذا كانت سلسلة Unicode بنفس القيمة موجودة بالفعل في هذا الجدول، فإن هذه الطريقة ترجع السلسلة الموجودة بالفعل في الجدول. العنوان، إذا لم تكن هناك سلسلة بنفس القيمة في الجدول، فقم بتسجيل عنوانك الخاص في الجدول "إذا فهمت جدول السلسلة العالمي، فقد قال كتجمع ثابت، جملته الأخيرة، "إذا لم يكن هناك سلسلة مع نفس القيمة في الجدول، فمن الخطأ تسجيل عنوانك الخاص في الجدول:
انظر إلى المثال 4:
انسخ رمز الكود كما يلي:
String s1=new String("kvill");
سلسلة s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2 );
System.out.println( s2==s1.intern() );
والنتيجة هي:
خطأ شنيع
كفيل كفيل
حقيقي
في هذا الفصل، لم نعلن عن ثابت "kvill"، لذلك لم يكن هناك "kvill" في تجمع الثوابت في البداية. عندما قمنا باستدعاء s1.intern()، تمت إضافة ثابت "kvill" جديد إلى تجمع الثوابت اتضح أن "kvill" غير الموجود في التجمع الثابت لا يزال موجودًا، مما يعني أنه "لا يسجل عنوانه الخاص في التجمع الثابت".
s1==s1.intern() خطأ، مما يشير إلى أن "kvill" الأصلي لا يزال موجودًا؛
s2 هو الآن عنوان "kvill" في التجمع الثابت، لذا فإن s2==s1.intern() صحيح.
5. حول يساوي () و ==:
بالنسبة للسلسلة، هذا ببساطة لمقارنة ما إذا كانت تسلسلات Unicode لسلسلتين متكافئتين، وإرجاع صحيح إذا كانت متساوية؛ و == لمقارنة ما إذا كانت عناوين السلسلتين متماثلة، أي ما إذا كانت مرجعًا إلى نفس السلسلة.
6. حول السلسلة غير قابل للتغيير
هناك الكثير مما يمكن قوله حول هذا الأمر طالما أنك تعلم أن مثيل السلسلة لن يتغير بمجرد إنشائه، على سبيل المثال: String str="kv"+"ill"+" "+"ans";
هناك 4 ثوابت سلسلة. أولاً، يقوم "kv" و"ill" بإنشاء "kvill" الذي يتم تخزينه في الذاكرة. ثم يتم دمج "kvill" مع "" لإنشاء "kvill" ويتم تخزينه في النهاية يتم دمجها مع "kvill ans" لإنشاء "kvill ans" وتعيين عنوان هذه السلسلة إلى str، لأن "ثبات" السلسلة ينشئ العديد من المتغيرات المؤقتة، ولهذا السبب يوصى باستخدام StringBuffer، لأن StringBuffer هو للتغيير.