سؤال

النظر في هذا الرمز:

class test {
   public static void main(String[] args) {
      test inst_test = new test();
      int i1 = 2000;
      int i2 = 2000;
      int i3 = 2;
      int i4 = 2;
      Integer Ithree = new Integer(2); // 1
      Integer Ifour = new Integer(2); // 2
      System.out.println( Ithree == Ifour );
      inst_test.method( i3 , i4 );
      inst_test.method( i1 , i2 );
   }
   public void method( Integer i , Integer eye ) {
      System.out.println(i == eye );
   }
}

يطبع:

false
true
false

أنا أفهم الأول false, ، يقوم المشغل == فقط يتحقق فقط إذا كانت المراجع تعمل على نفس الكائن، والتي في هذه الحالة ليست كذلك.

ما يلي true و false اجعلني خدش رأسي. لماذا تعتبر جافا i3 و i4 متساوية ولكن i1 و i2 مختلف؟ كلاهما قد تم لفه عدد صحيح، لا ينبغي على حد سواء تقييم إلى FALSE؟ هل هناك سبب عملي لهذا التناقض؟

هل كانت مفيدة؟

المحلول

التمهيدي البدائيين في كائنات (كما هو مستخدم في مكالماتك إلى method يستخدم ذاكرة التخزين المؤقت للقيم الصغيرة. من قسم مواصفات لغة Java 5.1.7:

إذا كانت القيمة P أن تكون محاصرات صحيحة أو كاذبة أو بايت، فاجرا في نطاق النطاق u007 إلى u007f، أو عدد int أو قصير بين -128 و 127، ثم دع R1 و R2 تكون نتائج أي تحويلين للملاكمة من ص. هو الحال دائما أن R1 == R2.

جزء المناقشة من المواصفات التالية على الفور مثيرة للاهتمام أيضا. لا سيما jvm يمكن أن ذاكرة التخزين المؤقت أكثر القيم إذا أرادت - لا يمكنك التأكد من نتائج القيام:

Integer i1 = 129;
Integer i2 = 129;
boolean b = (i1 == i2);

نصائح أخرى

عندما يتم تخزين الأستاذ التمهيدي، يتم تخزين الأعداد الصحيحة بين 128 و 127 مخزنة مؤقتا، ويتم إرجاع كائن المجمع نفسه. نفس الشيء مع القيم المنطقية وقيم char بين u0000 و u007f

هذا هو ما تحصل عليه معظم الوقت، ومع ذلك يعتمد على تنفيذ JVM.

وذلك لأن الملاكمة يجعل أعداد صحيحة أقل من قيمة معينة (128، وأعتقد أن) الرجوع إلى بعض الكائن المحدد، وقيم أعلى إلى كائنات جديدة.

استخدامات التمهيدية Integer.valueof (I), ، وليس عدد صحيح جديد (I)، لبناء كائن عدد صحيح الطبقة.

كما قال الآخرون، يستخدم ValueOf () ذاكرة تخزين مؤقت، معظمها مقابل كفاءة الفضاء.

لا تستخدم == على الأنواع المرجعية، فهي دائما تقريبا خطأ.

تحتوي الطبقة الصحيحة على ذاكرة التخزين المؤقت لبعض الحالات المستخدمة بشكل متكرر. تختلف نطاق القيم عموما من JVM إلى JVM (في بعض الأحيان أمر قابل للتكوين أيضا) ولكن بشكل عام الرمز المناسب هو شيء مثل:

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

(رمز من الشمس JDK 1.6)

هذا هو مثل سلسلة متدرجة، لأنه يحفظ الذاكرة ويسمح للمساواة في الاختبار باستخدام مرجع (على سبيل المثال == بدلا من تساوي)

أعتقد أن التفاف يحاول تقليل عدد الكائنات الصحيحة وإنشاء كائن واحد فقط يمثل 2 تحفظ ذاكرة.

فقط تذكر أن تستخدم أبدا == على الكائنات التي لا تعرفها أبدا ما يحدث.

الاستمتاع باستخدام بعض آلية التخزين المؤقت. عادة يجب أن تعتمد أبدا ==, ، دائما يستخدم equals للتحقق من المساواة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top