اختبار 1:
دعونا نلقي نظرة أولاً على مجموعة من مقارنات نوع السلسلة. دون مزيد من اللغط ، فقط أدخل الرمز:
اختبار الفئة العامة {public static void main (string [] args) {String a = "Java Book Garden" ؛ سلسلة B = "جافا كتاب حديقة" ؛ سلسلة C = سلسلة جديدة ("جافا كتاب حديقة") ؛ سلسلة D = سلسلة جديدة ("حديقة Java Book"). Intern () ؛ if (a == b) {system.out.println ("a == b") ؛ } آخر {system.out.println ("a! = b") ؛ } if (A.equals (b)) {system.out.println ("A.Equals (b)") ؛ } آخر {system.out.println ("! A.equals (b)") ؛ } if (a == c) {system.out.println ("a == c") ؛ } آخر {system.out.println ("a! = c") ؛ } if (A.equals (c)) {system.out.println ("A.Equals (c)") ؛ } آخر {system.out.println ("! A.equals (c)") ؛ } if (a == d) {system.out.println ("a == d") ؛ } آخر {system.out.println ("a! = d") ؛ } if (a.equals (d)) {system.out.println ("A.Equals (d)") ؛ } آخر {system.out.println ("A.equals (d)") ؛ }}}نتيجة الإخراج:
a == ba.equals (b) a! = ca.equals (c) a == da.equals (d)
تلخيص:
النتيجة A == B: عند تشغيل البرنامج ، سيقوم بإنشاء تجمع مخزن مؤقت للسلسلة. عندما يتم وضع String A = "Java Book Garden" ، يتم وضع "Java Book Garden" في مجموعة Buffer Boot. عندما تنشئ String B = "Java Book Garden" سلسلة ، سيبحث البرنامج أولاً عن كائنات بنفس القيمة في تجمع المخزن المؤقت هذا. لذلك ، عند إنشاء B ، يجد البرنامج A بنفس القيمة ويشير إلى الكائن المشار إليه بواسطة A. لذلك ، أشار A و B إلى نفس الكائن ، لذلك A == B.
نتيجة لذلك ، a! = c: String c = new String ("Java Book Garden") كائن جديد جديد ، لذلك لا يتم البحث عنه من مجموعة Buffer Boot ، ويقوم بإنشاء كائن جديد مباشرة. لذلك! = ج.
النتيجة A == D: عند استدعاء طريقة المتدرب ، إذا كان المجمع يحتوي بالفعل على سلسلة مساوية لكائن السلسلة هذا (يتم تحديد الكائن بواسطة طريقة (الكائن)) ، يتم إرجاع السلسلة الموجودة في التجمع. خلاف ذلك ، أضف كائن السلسلة هذا إلى التجمع ويعيد مرجعًا إلى كائن السلسلة هذا. جميع D يدعو كائنات من أ.
يساوي يقارن القيم ، لذلك عندما تكون القيم متماثلة ، فهي متساوية.
الاختبار 2:
فيما يلي اختبار لمجموعة من أنواع int وأنواع عدد صحيح:
اختبار الفئة العامة {public static void main (string [] args) {int a = 127 ؛ int A1 = 127 ؛ int b = 128 ؛ عدد صحيح C = 127 ؛ عدد صحيح C1 = 127 ؛ عدد صحيح D = 128 ؛ عدد صحيح D1 = 128 ؛ if (a == a1) {system.out.println ("a == a1") ؛ } آخر {system.out.println ("a! = a1") ؛ } if (b == b1) {system.out.println ("b == b1") ؛ } آخر {system.out.println ("b! = b1") ؛ } if (c == c1) {system.out.println ("c == c1") ؛ } آخر {system.out.println ("c! = c1") ؛ } if (d == d1) {system.out.println ("d == d1") ؛ } آخر {system.out.println ("d! = d1") ؛ }}}نتيجة الإخراج:
a == a1b == b1c == c1d! = d1
النتيجة "A == A1" و "B == B1": int هي أنواع أساسية ، ويتم تخزين القيم مباشرة ، في حين أن عدد صحيح هو كائن ، ويشير إلى هذا الكائن مع مرجع. معظم المقارنات مصنوعة من "A == A1" و "B == B1".
النتائج "C == C1" و "D! = D1" قد يكون لها أسئلة هنا ، لماذا "D! = D1". دعونا نلقي نظرة على رمز المصدر للتصميم معًا.
/** * ذاكرة التخزين المؤقت لدعم دلالات هوية الكائن من Autoboxing للقيم بين * -128 و 127 (شاملة) كما هو مطلوب من قبل JLS. * * تتم تهيئة ذاكرة التخزين المؤقت عند الاستخدام الأول. يمكن التحكم في حجم ذاكرة التخزين المؤقت * بواسطة خيار -xx: AutoBoxCachemax = <Size>. * أثناء تهيئة VM ، يمكن تعيين خاصية java.lang.integer.integercache.high * في خصائص النظام الخاص في فئة * sun.misc.vm. */ private static class integercache {static final int low = -128 ؛ ثابت النهائي int عالية. ذاكرة التخزين المؤقت الثابتة النهائية [] ؛ يمكن تكوين القيمة العالية {// عالية القيمة بواسطة الخاصية int h = 127 ؛ سلسلة integercachehighpropvalue = sun.misc.vm.getSavedProperty ("java.lang.integer.integercache.high") ؛ if (integerCacheHighpropValue! = null) {int i = parseint (integerCacheHhighpropValue) ؛ i = math.max (i ، 127) ؛ // الحد الأقصى لحجم الصفيف هو integer.max_value h = math.min (i ، integer.max_value -(-low) -1) ؛ } عالية = h ؛ ذاكرة التخزين المؤقت = عدد صحيح جديد [(ارتفاع - منخفض) + 1] ؛ int j = low ؛ لـ (int k = 0 ؛ k <cache.length ؛ k ++) ذاكرة التخزين المؤقت [k] = عدد صحيح جديد (j ++) ؛ } private integercache () {}} /** * إرجاع مثيل {code integer} الذي يمثل القيمة المحددة * {code int}. إذا لم يكن هناك حاجة إلى مثيل {code integer} جديدًا ، فيجب استخدام هذه الطريقة بشكل عام في تفضيل * المُنشئ {link #integer (int)} ، لأن هذه الطريقة من المحتمل أن تسفر عن أداء أفضل بكثير للوقت والوقت عن طريق * التخزين المؤقت للقيم المتكررة بشكل متكرر. * * ستؤدي هذه الطريقة دائمًا إلى تخزين القيم في النطاق -128 إلى 127 ، * شاملة ، وقد تقوم بتخزين قيم أخرى خارج هذا النطاق. * * param i a {code int} القيمة. * return مثيل {code integer} يمثل {code i}. * since 1.5 */ public static integer valueof (int i) {Assert IntegerCache.high> = 127 ؛ if (i> = integercache.low && i <= integercache.high) إرجاع integercache.cache [i + (-integercache.low)] ؛ إرجاع عدد صحيح جديد (i) ؛ }الخلاصة: هنا يقوم عدد صحيح بتهيئة مجموعة ثابتة من [-128،127]. إذا كانت القيمة في هذا النطاق ، يتم الرجوع إلى نفس الكائن. إذا لم يكن في هذا النطاق ، فيمكن رؤيته من الكود المصدري أن الكائن الجديد الذي تم إرجاعه هو: إرجاع عدد صحيح جديد (I) ؛
لذلك ، تشير النتيجة "C == C1" إلى نفس الكائن ، وتشير النتيجة "d! = D1" إلى كائن جديد جديد ، لذلك يختلف.