دعونا نلقي نظرة على قطعة من الكود:
الفئة العامة الرئيسية {public static void main (string [] args) {Integer num1 = 100 ؛ عدد صحيح num2 = 100 ؛ عدد صحيح num3 = 200 ؛ عدد صحيح num4 = 200 ؛ '' '' // نتيجة الإخراج '' 'System.out.println (num1 == num2) ؛ System.out.println (num3 == num4) ؛ }} خمن ما هي النتيجة؟
يعتقد الكثير من الناس أن النتيجة صحيحة ، لكن النتيجة ليست هكذا.
حقيقي
خطأ شنيع
لماذا هذه النتيجة؟ إذا تم شرح النتيجة بالذاكرة ، فإن Num1 و Num2 يشيران إلى نفس الكائن ، بينما يشير Num3 و Num4 إلى كائنات مختلفة. بعد ذلك ، دعنا نخبرك لماذا ، نلقي نظرة على الكود المصدري لطريقة القيمة من نوع INTEGER:
القيمة العددية الثابتة العامة (int i) {Assert IntegerCache.high> = 127 ؛ if (i> = integercache.low && i <= integercache.high) إرجاع integercache.cache [i + 128] ؛ إرجاع عدد صحيح جديد (i) ؛ }تنفيذ integercache:
"'' '// IntegerCache ، فئة داخلية ، لاحظ أن خصائصه يتم تعريفها على أنها نهائية ثابتة' 'integercache {static final int int ؛ '' '' // cache العلوي bound ، خالية مؤقتا '' 'ذاكرة التخزين المؤقت integer النهائي الثابت [] ؛ '' '// cache integer array' '' '' // block ، لماذا يتم تعريفه على أنه كتلة "ثابت {Final int low = -128 ؛ '' '// ذاكرة التخزين المؤقت السفلى ملزمة ، غير قابلة للتغيير. يمكن تكوين القيمة العلوية فقط "" "" "" // القيمة العالية بواسطة الخاصية "" القيمة "" // H "، والتي يمكن تعديلها عن طريق ضبط معلمة AutoboxCachemax من JDK (يوجد تفسير أدناه) ، وتم تعيين فاصل ذاكرة التخزين المؤقت التلقائي على [-128 ، N]. لاحظ أن الحد الأدنى للفاصل الزمني ثابت HE H = 127 ؛ if (integerCacheHighpropValue! = null) {'' '' // استخدم long.decode هنا لتجنب استدعاء الأساليب التي "'' '' '// تتطلب ذاكرة التخزين المؤقت التلقائية الخاصة بـ integer ، يتم الحصول على قيمة علوية مرشح' '' i = i = i = long.decode (integerCacheHighpropValue) .intvalue () ؛ '' '// خذ الجزء الأكبر كحدود أعلى ، ولكن لا يمكن أن يكون أكبر من حدود عدد صحيح max_value "' i = math.max (i ، 127) ؛ '' '// الحد الأقصى لحجم الصفيف هو integer.max_value' '' h = math.min (i ، integer.max_value - -low) ؛ } عالية = h ؛ "'' // يتم تحديد الحد الأعلى" "" "" "// يمكنك إنشاء كتلة ذاكرة التخزين المؤقت ، والانتباه إلى حجم صفيف ذاكرة التخزين المؤقت" "Cache = New Integer [(عالية - منخفضة) + 1] ؛ // int j = low ؛ لـ (int k = 0 ؛ k <cache.length ؛ k ++) ذاكرة التخزين المؤقت [k] = عدد صحيح جديد (j ++) ؛ "'' // -128 إلى القيم العالية يتم تخصيصها لتصنيع ذاكرة التخزين المؤقت واحدة تلو الأخرى '' '} integercache () {}}من خلال هاتين القطعتين من التعليمات البرمجية ، يمكن ملاحظة أنه عند إنشاء كائن نوع عدد صحيح من خلال طريقة ValueOF ، يكون نطاق القيمة [-128 ، 127]. في هذا الفاصل ، يشير المؤشر إلى مرجع كائن موجود بالفعل في integercache.cache. عندما تتجاوز القيمة هذا النطاق ، سيتم إنشاء كائن جديد.
شيء واحد يجب ملاحظة أنه ليس كل الأنواع في هذا النطاق ، انظر إلى النوع المزدوج:
الفئة العامة الرئيسية {public static void main (string [] args) {double i1 = 100.0 ؛ Double I2 = 100.0 ؛ Double i3 = 200.0 ؛ Double i4 = 200.0 ؛ system.out.println (i1 == i2) ؛ System.out.println (i3 == i4) ؛ }}نتيجة الإخراج النهائي:
خطأ شنيع
خطأ شنيع
لسبب محدد يجعل هذا هو النتيجة ، يمكنك التحقق من تنفيذ طريقة القيمة المزدوجة في الكود المصدري. إنه يختلف عن طريقة قيمة عدد صحيح لأن عدد قيم عدد صحيح في نطاق معين محدود ، لكن أرقام النقاط العائمة ليست كذلك.
لاحظ أن تنفيذ أساليب قيمة عدد صحيح ، بايت ، بايت ، شخصية ، وطويلة متشابهة.
تنفيذ طريقة قيمة Double و Float متشابهة.
اسحب واحدة ، ونتائج نوع Boolean لها اثنان صحيحين أو خطأين. انظر مباشرة إلى رمز المصدر:
قيمة منطقية ثابتة (Boolean B) {return (b؟ True: false) ؛ }يتم تعريف الصواب والخطأ على النحو التالي:
Public Static Final Boolean True = New Boolean (true) ؛ '' '/**' '' '' '' ** الكائن <code> boolean </code> المقابل للبدائية '' '' '' '* value <code> false </code>. '' '' '**/' '' '' '' ''*public static boolean false = new boolean (false) ؛
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.