بادئ ذي بدء ، يجب أن نكون واضحين أنه لا يزال هناك فرق في طريقة المتدرب لفئة السلسلة في JDK1.6 و JDK1.7:
المتدرب في JDK1.6:
عند استدعاء طريقة المتدرب ، أولاً ، انتقل إلى مجموعة ثابتة لمعرفة ما إذا كانت هناك قيمة مثل قيمة السلسلة الحالية. إذا كانت موجودة ، فسيقوم بإرجاع مرجع مباشرة إلى قيمة السلسلة في التجمع الثابت ؛ إذا لم يكن موجودًا ، فسيتم نسخ السلسلة من الكومة الأصلية إلى البركة الثابتة.
المتدرب في JDK1.7:
عند استدعاء طريقة المتدرب ، أولاً ، انتقل إلى مجموعة ثابتة لمعرفة ما إذا كانت هناك قيمة مثل قيمة السلسلة الحالية. إذا كانت موجودة ، فسيقوم بإرجاع مرجع مباشرة إلى قيمة السلسلة في التجمع الثابت ؛ إذا لم يكن موجودًا ، فسيقوم فقط بوضع الإشارة إلى الكومة الأصلية في التجمع الثابت ، ولن يقوم بنسخ السلسلة بأكملها إلى تجمع ثابت.
هذا يعني أن JDK1.6 و JDK1.7 يتعاملان بشكل مختلف عندما لا تكون هذه السلسلة موجودة في التجمع الثابت.
فيما يلي مثال للتحقق وشرح:
مثال:
Main Static Void Main (String [] args) {String str = "str"+new string ("01") ؛ ① str.intern () ؛ ② string str1 = "str01" ؛ ③ system.out.println (str == str1) ؛ String str2 = سلسلة جديدة ("str01") ؛ ④ str2.intern () ؛ ⑤ string str3 = "str01" ؛ ⑥ system.out.println (str2 == str3) ؛ String str4 = "str01" ؛ ⑦ string str5 = سلسلة جديدة ("str")+سلسلة جديدة ("01") ؛ ⑧ str5.intern () ؛ ⑨ system.out.println (str4 == str5) ؛ في JDK1.6 ، نتيجة الإخراج هي:
خطأ شنيع
خطأ شنيع
خطأ شنيع
يشرح:
① أثناء التنفيذ ، سيتم إنشاء كائن سلسلة مع القيمة "STR01" في ذاكرة الكومة ، وسيتم إنشاء ثوابت "STR" و "01" في التجمع الثابت ؛
② عند التنفيذ ، انتقل أولاً إلى المجموعة الثابتة للتحقق مما إذا كانت هناك قيمة ثابتة لـ "STR01" وتجد أنها غير موجودة. طريقة JDK1.6 هي إنشاء نسخة من السلسلة "STR01" في التجمع الثابت ؛
③ أثناء التنفيذ ، سيتم إنشاء كائن "STR01" في المجموعة الثابتة ، وسيجد أنه موجود بالفعل ، لذلك لن يتم إنشاؤه جديدًا ؛
سبب أول إخراج كاذب هو أن STR يشير إلى "STR01" في ذاكرة الكومة ، بينما يشير STR1 إلى "STR01" في المجموعة الثابتة ؛
④ عند التنفيذ ، سيتم إنشاء كائن سلسلة STR2 بقيمة "STR01" في ذاكرة الكومة ، وسيتم إنشاء ثابت مع قيمة "STR01" في التجمع الثابت ؛
⑤ عند التنفيذ ، انتقل أولاً إلى مجموعة ثابتة للتحقق مما إذا كانت هناك قيمة ثابتة لـ "STR01". عندما وجد أنه موجود ، سيعود مباشرة إلى هذه المرجع الثابت ؛
⑥ أثناء التنفيذ ، سيتم إنشاء قيمة ثابتة لـ "STR01" في المجموعة الثابتة. إذا وجد أنه موجود بالفعل ، فلن يتم إنشاؤه ؛
سبب الإخراج الثاني الخاطئ هو أن STR2 يشير إلى "STR01" في ذاكرة الكومة ، بينما يشير STR3 إلى "STR01" في البركة الثابتة ؛
⑦ أثناء التنفيذ ، سيتم إنشاء قيمة ثابتة لـ "STR01" في المجموعة الثابتة ؛
⑧ عند التنفيذ ، سيتم إنشاء كائن سلسلة STR5 مع القيمة "STR01" في ذاكرة الكومة ، وسيتم إنشاء ثوابت "STR" و "01" في التجمع الثابت ؛
⑨ عند التنفيذ ، سيتم استخدام التجمع الثابت للتحقق مما إذا كانت هناك قيمة ثابتة لـ "STR01". إذا تم العثور عليه ، فسيعود هذا المرجع المستمر مباشرة ؛
سبب الإخراج الثالث الخاطئ هو أن STR5 يشير إلى "STR01" في ذاكرة الكومة ، في حين يشير STR4 إلى "STR01" في المجموعة الثابتة ؛
في JDK1.7 ، نتيجة الإخراج هي:
حقيقي
خطأ شنيع
خطأ شنيع
يشرح:
لقد وجدت أن نتيجة الإخراج الأولى فقط مختلفة ، لذلك نوضح فقط سبب الأول:
① أثناء التنفيذ ، سيتم إنشاء كائن سلسلة مع القيمة "STR01" في ذاكرة الكومة ، وسيتم إنشاء ثابت "STR" و "01" في التجمع الثابت ؛ (هذا لا يختلف عن JDK1.6)
② عند التنفيذ ، انتقل أولاً إلى المجموعة الثابتة للتحقق مما إذا كانت هناك قيمة ثابتة لـ "STR01" وتجد أنها غير موجودة. طريقة JDK1.7 هي نسخ مرجع "STR01" في ذاكرة الكومة إلى التجمع الثابت ؛
③ أثناء التنفيذ ، سيتم إنشاء كائن "STR01" في المجموعة الثابتة ، وسيجد أنه موجود بالفعل ، لذلك لن يتم إنشاؤه جديدًا ؛
ثم في هذا الوقت ، سيشير كل من STR1 إلى قيمة "STR01" في ذاكرة الكومة ، وبالتالي فإن الاثنين متساوية ؛
ما سبق هو مقارنة بين طريقة المتدرب لفئة السلسلة في JDK1.6 و JDK1.7. هناك اختلافات. يمكن للأصدقاء الذين يحتاجون إليها الرجوع إليها.