عادةً ما يتم تقسيم تجمع Java الثابت إلى نوعين: تجمع ثابت ثابت ومسبح ثابت وقت التشغيل
تجمع ثابت ثابت: تجمع ثابت في ملف الفصل. يتضمن التجمع الثابت في ملف الفئة القيم الحرفية (رقم) السلسلة ، ومعلومات الفئة والطريقة ، وتحتل معظم المساحة في ملف الفئة.
حمام السباحة الثابت في وقت التشغيل: بعد أن يكمل JVM تحميل الفصل ، يقوم بتحميل المسبح الثابت في ملف الفئة في الذاكرة ويحفظه في منطقة الطريقة. ما نتحدث عنه عادةً هو المجموعة الثابتة لمسبح وقت التشغيل في منطقة الطريقة. ميزة أخرى مهمة من تجمعها الثابت مقارنة بملف الفئة هي ديناميته. لا تتطلب لغة Java إنشاء ثوابت فقط خلال فترة التجميع ، أي أن محتويات التجمع الثابت في ملف الفصل يمكن أن تدخل تجمع وقت تشغيل منطقة الطريقة. أثناء الجري ، يمكن أيضًا وضع الثوابت الجديدة في حمام السباحة. هذه الميزة أكثر شيوعا من قبل المطورين. طريقة المتدرب () لفئة السلسلة.
عداد البرنامج: هو خط أنابيب لتنفيذ البرنامج ، يشير إلى أي أمر سيتم تنفيذه بعد ذلك.
مكدس الطريقة المحلية: المكدس المستخدمة من قبل JVM لاتصال طرق نظام التشغيل.
مكدس الجهاز الظاهري: المكدس المستخدمة من قبل JVM لتنفيذ رمز Java
كومة الجهاز الظاهري: حيث يتم تخزين الكائنات ، ويتم تخزين جميع الكائنات الجديدة في برامج Java في الكومة.
منطقة الطريقة: تخزين الثوابت ومعلومات الفصل والمتغيرات الثابتة ، والتي يمكن فهمها على أنها الموقع الذي يتم فيه تخزين ملف الفصل في الذاكرة.
فوائد التجميع المستمر:
تُستخدم التجمعات الثابتة لتجنب إنشاء وتدمير الكائنات المتكررة التي تؤثر على أداء النظام ، وتدرك مشاركة الكائنات.
على سبيل المثال ، يتم استخدام تجمع ثابت للسلسلة لوضع جميع الأسلاك الحرفية في تجمع ثابت أثناء مرحلة التجميع.
1. حفظ مساحة الذاكرة: يتم دمج جميع ثوابت السلسلة بنفس القيمة الحرفية في المجموعة الثابتة ، وتتناول مساحة واحدة فقط
2. حفظ وقت التشغيل: عند إجراء مقارنات السلسلة ، == أسرع من متساوي (). لمتغيري مرجعية ، ما عليك سوى استخدام == لتحديد ما إذا كانت المراجع متساوية ، بحيث يمكنك تحديد ما إذا كانت القيم الفعلية متساوية.
== تختلف معاني أنواع البيانات الأساسية وتمثيلات الكائنات.
لنوع البيانات الأساسية: == المقارنة هي قيمة نوع البيانات الأساسية للكائن: == المقارنة هو عنوان ذاكرة الكائن في الذاكرة
8 فئات التغليف أنواع البيانات الأساسية والتجمعات المستمرة
تنفذ معظم فئات الغلاف لأنواع البيانات الأساسية في Java تقنيات التجميع المستمرة ، وهي Byte ، قصيرة ، عدد صحيح ، طويل ، شخصية ، منطقية.
عدد صحيح I1 = 40 ؛ عدد صحيح I2 = 40 ؛ System.out.println (i1 == i2) ؛ // true
بايت ، قصيرة ، عدد صحيح ، طويل ، مثل هذه الفئات الغلاف الخمسة تنشئ بيانات ذاكرة التخزين المؤقت للنوع المقابل من [-128 ، 127] افتراضيًا وتخزينه في التجمع الثابت. إذا تجاوز هذا النطاق ، فسيظل هناك كائن جديد.
القيمة العددية الثابتة العامة (int i) {Assert IntegerCache.high> = 127 ؛ if (i> = integercache.low && i <= integercache.high) إرجاع integercache.cache [i + (-integercache.low)] ؛ إرجاع عدد صحيح جديد (i) ؛ }عدد صحيح I1 = 400 ؛ عدد صحيح I2 = 400 ؛ system.out.println (i1 == i2) ؛ // false
2. نوعان من فئات التغليف الأرقام العائمة ، لا تنفذ تقنية التجميع الثابتة.
Double D1 = 2.5 ؛ Double D2 = 2.5 ؛ System.out.println (D1 == D2) ؛ // false
3. سيناريوهات لتطبيق حمامات ثابتة
(1) .integeri1 = 40 ؛ نظرًا لأن عدد صحيح هو فئة غلاف من نوع البيانات الأساسي int وهي كائن ، فإن Java ستقوم بإجراء عمليات ملاكمة تلقائية عند تجميع الكود وتغلفها مباشرة في integeri1 = integer.valueof (40) ، وبالتالي استخدام كائنات في التجمع الثابت
(2) .integeri1 = newInteger (40) ؛ في هذه الحالة ، سيتم إنشاء كائن جديد
عدد صحيح I1 = 40 ؛ عدد صحيح I2 = عدد صحيح جديد (40) ؛ system.out.println (i1 == i2) ؛ // false
في هذه الحالة ، لن يقوم عدد صحيح جديد بإجراء الثوابت الموجودة في الملاكمة التلقائية في المجموعة الثابتة ، ولكنها ستقوم مباشرة بإنشاء كائن جديد في الكومة.
4. تفاصيل عدد صحيح
عدد صحيح I1 = 40 ؛ عدد صحيح I2 = 40 ؛ عدد صحيح i3 = 0 ؛ عدد صحيح i4 = عدد صحيح جديد (40) ؛ عدد صحيح i5 = عدد صحيح جديد (40) ؛ عدد صحيح i6 = عدد صحيح جديد (0) ؛ عدد صحيح i7 = 128 ؛ عدد صحيح i8 = 128 ؛ system.out.println ("i1 = i2" + (i1 == i2)) ؛ System.out.println ("i1 = i2 + i3" + (i1 == i2 + i3)) ؛ system.out.println ("i1 = i4" + (i1 == i4)) ؛ system.out.println ("i4 = i5" + (i4 == i5)) ؛ System.out.println ("i4 = i5 + i6" + (i4 == i5 + i6)) ؛ System.out.println ("40 = i5 + i6" + (40 == i5 + i6)) ؛ System.out.println ("i7 = i8" + (i7 == i8)) ؛i1 = i2 truei1 = i2+i3 truei1 = i4 falsei4 = i5 falsei4 = i5+i6 true40 = i5+i6 truei7 = i8 false
Explanation: البيان i4 == i5 + i6 ، لأن عامل التشغيل + لا ينطبق على كائنات عدد صحيح. أولاً ، يقوم i5 و i6 بإجراء عمليات إلغاء التزام التلقائي وإضافة قيم ، أي i4 == 40. بعد ذلك ، لا يمكن مقارنة كائن عدد صحيح مباشرة بالقيمة العددية ، لذا فإن i4 تلقائيًا تلقائيًا وتحويلها إلى القيمة int 40. أخيرًا ، يتم تحويل هذا البيان إلى 40 == 40 للمقارنة العددية.
فئة السلسلة ومسبح ثابت
1. كيف لإنشاء كائن سلسلة
String S1 = "ABDCD" ؛ String S2 = سلسلة جديدة ("ABCD") ؛ System.out.println (S1 == S2) ؛ // falseهناك اختلافات في طرق إنشاء هاتين الطريقتين المختلفة. الأول هو أخذ كائنات في التجمع الثابت ، والثاني هو إنشاء كائنات جديدة في مساحة ذاكرة الكومة.
مجرد استخدام كائنات جديدة سيتم إنشاء في الكومة.
2. تعبير الاتصال+
(1). سيتم إضافة الكائنات الجديدة التي تم إنشاؤها بواسطة اتصال "+" بين كائنات السلسلة التي تم إنشاؤها باستخدام "" النص "إلى مجموعة STRING STANTER.
(2). بالنسبة إلى النماذج الأخرى مثل مرجعين للكائنات المتصلتين مباشرة من خلال "+" أو الكائنات التي تم إنشاؤها من خلال وضع جديد ، فلن تتم إضافة الكائنات الجديدة الناتجة إلى تجمع السلسلة الثابت.
String str1 = "str" ؛ string str2 = "ing" ؛ String str3 = "str" + "ing"
السلسلة النهائية الثابتة العامة A = "AB" ؛ // aperation apublic static final string b = "cd" ؛ // ثابت Bpublic static void main (string [] args) {String s = a + b ؛ // تهيئة S مع + سلسلة متسلسلة t = "ABCD" ؛ if (s == t) {system.out.println ("s يساوي t ، فهي نفس الكائن") ؛ } آخر {system.out.println ("s لا يساوي t ، فهي ليست نفس الكائن") ؛ }} s يساوي t ، فهي نفس الكائنA و B كلاهما ثوابت ، والقيم ثابتة ، وبالتالي يتم إصلاح قيمة S أيضًا ، والتي يتم تحديدها عند تجميع الفئة. وبعبارة أخرى: السلسلة s = a+b ؛ أي ما يعادل: string s = "ab"+"CD" ؛
السلسلة النهائية الثابتة العامة أ ؛ // سلسلة نهائية ثابتة Apublic B ؛ // ثابت bstatic {a = "ab" ؛ B = "CD" ؛ } main static void main (string [] args) {// تهيئة s مع + سلسلة concatenation s = a + b ؛ سلسلة t = "ABCD" ؛ if (s == t) {system.out.println ("s يساوي t ، فهي نفس الكائن") ؛ } آخر {system.out.println ("s لا يساوي t ، فهي ليست نفس الكائن") ؛ }} s لا يساوي t ، فهي ليست نفس الكائنعلى الرغم من أن A و B يتم تعريفهما على أنهما ثوابت ، إلا أنه لم يتم تعيين أي منهما على الفور. قبل حساب قيمة S ، عندما يتم تعيينها والقيمة التي يتم تعيينها هي متغيرات. لذلك ، قبل تعيين A و B ، تكون خصائصها مشابهة للمتغير. بعد ذلك ، لا يمكن تحديد S خلال فترة التجميع ، ولكن لا يمكن إنشاؤها إلا في وقت التشغيل.
3.Strings1 = Newstring ("Xyz") ؛ كم عدد الأشياء التي تم إنشاؤها؟
النظر في مرحلة تحميل الفصل والتنفيذ الفعلي.
(1) سيتم إجراء تحميل الفئة مرة واحدة فقط على الفصل. يتم إنشاء "XYZ" وإقامة عند تحميل الفصل (إذا كانت سلسلة "XYZ" قد تم وضعها قبل تحميل الفصل ، فلا داعي لإنشاء مثيل "XYZ" مرارًا وتكرارًا. يتم وضع السلسلة المقيمة في مجموعة ثابتة سلسلة مشتركة عالميا.
(2) عند تشغيل هذا الرمز لاحقًا ، يتم إصلاح مثيل السلسلة المقابل لـ "XYZ" الحرفي ولن يتم إنشاؤه بشكل متكرر. لذلك يقوم هذا الرمز بنسخ نسخة من الكائن في التجمع الثابت ويضعه في الكومة ، ويسلم الإشارة إلى الكائن في الكومة إلى S1.
هذا البيان يخلق 2 كائنات.
4.java.lang.string.intern ()
ميزة أخرى مهمة من تجمع وقت التشغيل الثابت مقارنة بتجمع ثابت ملف الفئة هي ديناميته. لا تتطلب لغة Java إنشاء الثوابت فقط خلال فترة الترجمة ، أي أن محتويات التجمع الثابت في ملف الفصل يمكن أن تدخل منطقة الطريقة. يمكن أيضًا وضع الثوابت الجديدة في حمام السباحة أثناء وقت التشغيل. هذه الميزة أكثر شيوعا من قبل المطورين. طريقة المتدرب () لفئة السلسلة.
سوف تكتشف طريقة intern () للسلسلة ما إذا كانت هناك سلسلة من المتساوية في التجمع الثابت. إذا كان هناك ، فسوف يعيد إشارة إلى السلسلة. إذا لم يكن هناك ، فسيضيف سلسلة خاصة به إلى تجمع ثابت.
public static void main (string [] args) {String S1 = new string ("computer") ؛ السلسلة S2 = s1.intern () ؛ السلسلة S3 = "الكمبيوتر" ؛ System.out.println ("S1 == S2؟" + (S1 == S2)) ؛ System.out.println ("S3 == S2؟" + (S3 == S2)) ؛}S1 == S2؟ fals3 == S2؟ حقيقي
لخص
ما سبق هو كل شيء عن استكشاف برك جافا الثابت في العمق. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها.