يمكن تقسيم أنواع البيانات في Java إلى فئتين:
1. أنواع البيانات الأساسية، وتسمى أيضًا أنواع البيانات البدائية. لمقارنة البايت، القصير، char، int، الطويل، العائم، المزدوج، المنطقي، استخدم علامة المساواة المزدوجة (==)، وقارن قيمها.
2. أنواع البيانات المركبة (الفئات) عند مقارنتها باستخدام (==)، تتم مقارنتها مع عناوين تخزينها في الذاكرة، وبالتالي، ما لم تكن نفس الكائن الجديد، فإن نتيجة مقارنتها صحيحة، وإلا فإن المقارنة النتيجة كاذبة. ترث كافة الفئات في JAVA من كائن الفئة الأساسية. تحدد الفئة الأساسية في الكائن طريقة يساوي. يتمثل السلوك الأولي لهذه الطريقة في مقارنة عناوين الذاكرة للكائنات، ومع ذلك، يتم تجاوز هذه الطريقة في بعض مكتبات الفئات، مثل السلسلة و Integer و Date يساوي تطبيقه الخاص في هذه الفئات، بدلاً من مقارنة عنوان تخزين الفئة في ذاكرة الكومة. بالنسبة للمقارنة المتساوية بين أنواع البيانات المركبة، دون تجاوز طريقة التساوي، لا تزال المقارنة بينهما تعتمد على قيمة عنوان موقع تخزينها في الذاكرة، لأن طريقة التساوي للكائن تستخدم أيضًا علامة المساواة المزدوجة (==) للمقارنة ، وبالتالي فإن نتيجة المقارنة هي نفس نتيجة علامة المساواة المزدوجة (==).
انسخ رمز الكود كما يلي:
سلسلة اختبار فئة عامة {
publicstaticvoid الرئيسي(String[] args) {
سلسلة s1 = "الاثنين"؛
سلسلة s2 = "الاثنين"؛
إذا (s1 == s2)
{
System.out.println("s1 == s2");}
آخر{
System.out.println("s1 != s2");}
}
}
قم بتجميع البرنامج وتشغيله، الإخراج: s1 == s2 ملاحظة: يشير s1 وs2 إلى نفس كائن السلسلة - "الاثنين" 2. إذا قمت بتغيير البرنامج قليلاً، فستجد شيئًا أكثر غرابة:
انسخ رمز الكود كما يلي:
سلسلة اختبار فئة عامة {
publicstaticvoid الرئيسي (سلسلة [] الحجج)
{
سلسلة s1 = "الاثنين"؛
String s2 =new String("الاثنين");
إذا (s1 == s2) {System.out.println("s1 == s2");
}
آخر
{
System.out.println("s1 != s2");
}
إذا (s1.يساوي (s2))
{
System.out.println("s1 يساوي s2");
}
آخر
{
System.out.println("S1 لا يساوي s2");
}
}
}
نستخدم العامل الجديد لإنشاء مخرجات برنامج لـ s2: s1!= s2 s1 يساوي s2 ملاحظة: يشير s1 وs2 إلى كائنين من سلسلة "الاثنين" على التوالي.
3. تجمع المخزن المؤقت للسلسلة اتضح أن البرنامج سيقوم بإنشاء تجمع مخزن مؤقت للسلسلة عند تشغيله. عند استخدام تعبير مثل s2 = "Monday" لإنشاء سلسلة، سيبحث البرنامج أولاً عن نفس القيمة في السلسلة. Buffer.Object، في البرنامج الأول، تم وضع s1 لأول مرة في التجمع، لذلك عندما تم إنشاء s2، وجد البرنامج s1 بنفس القيمة وأشار إلى s2 إلى الكائن "Monday" المشار إليه بواسطة s1. باستخدام المشغل الجديد، يخبر البرنامج بوضوح: "أريد مشغلًا جديدًا! وليس المشغل القديم!" لذلك يتم إنشاء كائن Sting جديد "الاثنين" في الذاكرة. قيمهما واحدة، لكن موقعهما مختلف، أحدهما يسبح في حوض السباحة والآخر يستريح على الشاطئ. عفوًا، يا لها من مضيعة للموارد، لماذا يتعين علينا فصلهما عندما يكونان متماثلين بشكل واضح؟
4. قم بتغيير البرنامج مرة أخرى:
انسخ رمز الكود كما يلي:
سلسلة اختبار publicclass
{
publicstaticvoid الرئيسي (سلسلة [] الحجج)
{
سلسلة s1 = "الاثنين"؛
String s2 =new String("الاثنين");
s2 = s2.intern();
إذا (s1 == s2)
{
System.out.println("s1 == s2");
}
آخر
{
System.out.println("s1 != s2");
}
إذا (s1.يساوي (s2))
{
System.out.println("s1 يساوي s2");
}
آخر
{
System.out.println("S1 لا يساوي s2");
}
}
}
تمت إضافة هذه المرة: s2 = s2.intern(); إخراج البرنامج: s1 == s2 s1 يساوي s2 وتبين أن القيمة المرجعة لأسلوب (java.lang.String() "abc".intern() لا تزال سلسلة "abc"، ظاهريًا، يبدو أن هذه الطريقة لا فائدة منها، ولكنها في الواقع تؤدي خدعة صغيرة: تحقق مما إذا كانت هناك سلسلة مثل "abc" في تجمع السلاسل، وإذا كانت موجودة، قم بإرجاع السلسلة. سلسلة في التجمع، إذا لم تكن موجودة، ستضيف هذه الطريقة "abc" إلى تجمع السلسلة ثم ترجع مرجعها).