إشارات إلى كائنات عدد صحيح في جافا
لا يوجد مؤشر في جافا ، ولكن هناك أيضًا مفاهيم مرجعية. ما نريد التحدث عنه هنا هو ما إذا كان عدد صحيح هو نفس الكائن.
1. دعونا نلقي نظرة على قطعة من الكود أولاً:
الفراغ الثابت العام (سلسلة [] args) {Integer A1 = 100 ؛ عدد صحيح B1 = A1 ؛ // يمكن أن يكون الآخر أيضًا B1 = 100 حقل = NULL ؛ حاول {field = a1.getClass (). getDeclaredField ("value") ؛ } catch (nosuchfieldException e) {// todo catch catch e.printstacktrace () ؛ } catch (SecurityException e) {// todo catch catch e.printstacktrace () ؛ } field.setAccessible (true) ؛ حاول {field.set (a1 ، 5000) ؛ } catch (alfictalArgumentException e) {// todo catch catch e.printstacktrace () ؛ } catch (alfictalaccessexception e) {// todo catch catch e.printstacktrace () ؛ } system.out.println ("b1 ="+b1) ؛ عدد صحيح C1 = 100 ؛ System.out.println ("C1 ="+C1) ؛ } نتيجة:
B1 = 5000
C1 = 5000
مما سبق ، أولاً وقبل كل شيء ، أريد أن أشرح بعض الأشياء هنا.
1) بالنسبة إلى عدد صحيح ، تمت تهيئة عدد صحيح بين -128-127 ووضعه في integercache. إذا كانت معبأة ، فسيتم أخذ الكائن منه.
2) هل B1 = A1 مهمة عددية أم نفس الكائن؟ يمكن ملاحظة ذلك من النتائج التي يشير B1 و A1 إلى نفس الكائن ، وليس نفس القيمة العددية
3) C1 = 100 يعني أنه بالنسبة للقيم بين -128-127 ، جميع الكائنات التي تم الحصول عليها من integercache. بعد تغيير كائن INTEGER المقابل لـ 100 ، سيتم تغيير التعبئة اللاحقة البالغة 100. لأنه عند الحصول على كائنات في ذاكرة التخزين المؤقت ، يتم استخدام فهرس الصفيف ، ولا يتم استخدام مقارنات رقمية.
ومع ذلك ، فإن تعديل هذه التخزين المؤقت سيكون أكثر خطورة ، لذلك لا تمانع. من يدري أي حزمة أو منصة تحزم 100 يوان ، ولكن النتيجة ليست 100 يوان ، وستعطل في ذلك الوقت.
2. من خلال الوصف أعلاه ، ما هو الجواب إذا تم تغييره إلى هذا
public static void main (string [] args) {Integer A1 = 200 ؛ عدد صحيح B1 = A1 ؛ حقل الحقل = فارغ ؛ حاول {field = a1.getClass (). getDeclaredField ("value") ؛ } catch (nosuchfieldException e) {// todo catch catch e.printstacktrace () ؛ } catch (SecurityException e) {// todo catch catch e.printstacktrace () ؛ } field.setAccessible (true) ؛ حاول {field.set (a1 ، 5000) ؛ } catch (alfictalArgumentException e) {// todo catch catch e.printstacktrace () ؛ } catch (alfictalaccessexception e) {// todo catch catch e.printstacktrace () ؛ } system.out.println ("b1 ="+b1) ؛ عدد صحيح C1 = 200 ؛ System.out.println ("C1 ="+C1) ؛ } 3. ثم قم بتغييره
public static void main (string [] args) {Integer a1 = new integer (100) ؛ عدد صحيح B1 = A1 ؛ حقل الحقل = فارغ ؛ حاول {field = a1.getClass (). getDeclaredField ("value") ؛ } catch (nosuchfieldException e) {// todo catch catch e.printstacktrace () ؛ } catch (SecurityException e) {// todo catch catch e.printstacktrace () ؛ } field.setAccessible (true) ؛ حاول {field.set (a1 ، 5000) ؛ } catch (alfictalArgumentException e) {// todo catch catch e.printstacktrace () ؛ } catch (alfictalaccessexception e) {// todo catch catch e.printstacktrace () ؛ } system.out.println ("b1 ="+b1) ؛ عدد صحيح C1 = 100 ؛ System.out.println ("C1 ="+C1) ؛ } ما هو الجواب؟ بالنسبة للعمليات الجديدة ، فإن الكائنات ليست محاصرًا ، ولكن يتم إنشاؤها في الكومة.
ليس من الصعب فهم ما إذا كنت تفهم الملاكمة والتخزين المؤقت والاستشهاد. يمكنك تجربة ذلك بنفسك.
دعونا نحصل على بعض المعرفة الأساسية أولاً
مراسلات الأنواع الأساسية وفئات الغلاف بايت بايت قصيرة قصيرة int طويلة طويلة تعويم تعويم مزدوج حرف شار
المراسلات بين أنواع البيانات الأساسية في الثمانية أعلاه هي فقط int-> char- char->. التغييران مهمان ، والباقي فقط يحولان الحرف الأول إلى الأحرف الصغيرة.
دعنا نتعرف على الميزات الجديدة لـ JDK5: التعبئة التلقائية والملاحظة
الملاكمة التلقائية: تحويل الأنواع الأساسية إلى أنواع فصول التغليف
unboxing التلقائي: قم بتحويل نوع فئة الغلاف إلى النوع الأساسي
الفئة العامة demo_integer {public static void main (string [] args) {// قبل jdk1.5 int a = 100 ؛ عدد صحيح A1 = عدد صحيح جديد (أ) ؛ // لف نوع البيانات الأساسية في كائن ، المربع int b = a1.intvalue () ؛ // قم بتحويل الكائن إلى نوع البيانات الأساسي و unbox // بعد JDK1.5 int x = 100 ؛ عدد صحيح x1 = x ؛ // مربع تلقائيًا ، قم بتحويل نوع البيانات الأساسية إلى كائن int y = x1 + x ؛ // unbox تلقائيًا ، قم بتحويل الكائن إلى نوع البيانات الأساسي}}أشياء يجب ملاحظتها
الفئة العامة demo_integer {public static void main (string [] args) {Integer a = null ؛ int b = a + 100 ؛ // سوف تستدعي الطبقة السفلية من unboxing التلقائية }}أسئلة المقابلة
الفئة العامة demo_integer {public static void main (string [] args) {Integer i1 = new integer (97) ؛ عدد صحيح I2 = عدد صحيح جديد (97) ؛ system.out.println (i1 == i2) ؛ system.out.println (i1.equals (i2)) ؛ System.out.println ("-------------") ؛ عدد صحيح i3 = عدد صحيح جديد (197) ؛ عدد صحيح i4 = عدد صحيح جديد (197) ؛ System.out.println (i3 == i4) ؛ System.out.println (i3.equals (i4)) ؛ System.out.println ("------------------") ؛ }}الإخراج: خطأ خطأ ---------------------------------
سبب:
الجديد هو فتح مساحة في ذاكرة الكومة ، وقيمة عنوان المقارنة الطبيعية (==) خاطئة.
نظرًا لأن عدد صحيح يعيد كتابة طريقة متساوية ، فإن الإخراج المتساوي صحيح.
قد تشعر أنه بسيط للغاية وليس لديه محتوى فني ، لأن ما سبق ليس هو النقطة ، انظر إلى الرمز أدناه
الفئة العامة demo_integer {public static void main (string [] args) {Integer i1 = 127 ؛ عدد صحيح I2 = 127 ؛ system.out.println (i1 == i2) ؛ system.out.println (i1.equals (i2)) ؛ System.out.println ("--------------") ؛ عدد صحيح I3 = 128 ؛ عدد صحيح i4 = 128 ؛ System.out.println (i3 == i4) ؛ System.out.println (i3.equals (i4)) ؛ System.out.println ("---------------") ؛ }}الإخراج: صحيح -----------------------------------------
سبب:
لماذا يكون كائنين عندما يكون INT أكبر من 127؟ هل يشعر الرقم 127 مألوفًا جدًا؟
-128 إلى 127 هي نطاق القيمة للبايت. إذا كان ضمن نطاق القيمة هذا ، فلن يقوم الملاكمة التلقائية بإنشاء كائن جديد ، والحصول عليه من التجمع الثابت
إذا تم تجاوز نطاق قيمة البايت ، فسيتم إنشاء كائن جديد.
قم بحزم الطبقة الأساسية تلقائيًا واستدعاء طريقة ValueOF () ، تحليل رمز المصدر البسيط (JDK1.8):
يمتد عدد صحيح من الفئة النهائية للرقم ، يطبق الرقم المماثل <integer> {value static integer valueof (int i) {// when i> = -128 و i <= 127 ، سيتم إعادة تشغيل الكائن الموجود في المخزن المؤقت بشكل مباشر إذا (i> = integercache.low && إرجاع عدد صحيح جديد (i) ؛ // إذا تجاوز نطاق قيمة البايت النطاق ، فسيتم إنشاؤه في ذاكرة الكومة} // الفئة الداخلية بمثابة عازلة integercache integercache {static final int low = -128 ؛ ثابت النهائي int عالية. ذاكرة التخزين المؤقت الثابتة النهائية [] ؛ يمكن تكوين القيمة العالية {// عالية القيمة بواسطة الخاصية int h = 127 ؛ سلسلة integercachehighpropvalue = sun.misc.vm.getSavedProperty ("java.lang.integer.integercache.high") ؛ if (integerCacheHighpropValue! = null) {try {int i = parseint (integerCacheHighpropValue) ؛ i = math.max (i ، 127) ؛ // الحد الأقصى لحجم الصفيف هو integer.max_value h = math.min (i ، integer.max_value -(-low) -1) ؛ } catch (numberformatexception nfe) {// إذا كان لا يمكن تحليل الخاصية في int ، فتجاهلها. }} عالية = h ؛ ذاكرة التخزين المؤقت = عدد صحيح جديد [(ارتفاع - منخفض) + 1] ؛ int j = low ؛ لـ (int k = 0 ؛ k <cache.length ؛ k ++) ذاكرة التخزين المؤقت [k] = عدد صحيح جديد (j ++) ؛ // Range [-128 ، 127] يجب أن يتم استيعابها (JLS7 5.1.7) تأكيد integercache.high> = 127 ؛ } integercache () {}}} 8 أنواع أساسية من فئات التغليف وتجمعات الكائنات
تنفذ معظم الأنواع الأساسية من فئات الغلاف في Java تقنية التجميع المستمرة. هذه الفصول هي بايت ، قصيرة ، عدد صحيح ، طويل ، شخصية ، منطقية ، ونوعين آخرين من فئات الغلاف مع رقم النقطة العائمة لا يتم تنفيذها. بالإضافة إلى ذلك ، لا يمكن للحرف الخمسة الفصول الصحيح للبايت ، القصير ، العدد ، الطويل ، استخدام تجمع الكائن فقط عندما تكون القيمة المقابلة أقل من أو تساوي 127 ، أي أن الكائن ليس مسؤولاً عن إنشاء وإدارة كائنات من هذه الفئات أكبر من 127.
المعرفة الممتدة
في مواصفات JVM ، كل نوع له تجمع ثابت خاص به. التجمع الثابت هو مجموعة مرتبة من الثوابت المستخدمة من نوع معين ، بما في ذلك الثوابت المباشرة (الأنواع البدائية والسلاسل) والمراجع الرمزية إلى الأنواع الأخرى والحقول والأساليب. السبب في أنه مرجع رمزي بدلاً من تحديد أنواع أخرى مباشرة في وقت الترجمة هو أن Java مرتبط ديناميكيًا ، وفقط في وقت التشغيل ، يمكن تحديد مثيلات التبعية المحددة للنوع وفقًا لقواعد معينة. هذا هو أساس جافا لتنفيذ تعدد الأشكال.
في JVM ، تبدأ دورة حياة الفصل بأكملها من تحميلها في ذاكرة الجهاز الظاهري وحتى يتم تفريغها من الذاكرة. تشمل دورة حياتها بأكملها: التحميل ، والتحقق ، والتحضير ، والتحليل ، والتهيئة ، والاستخدام والتفريغ. مرحلة التحليل هي عملية استبدال الجهاز الظاهري مراجع الرمز في التجمع الثابت مع المراجع المباشرة.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.