الإجابة واحدة:
أحد أسئلة مقابلة Java الأكثر شيوعًا هو: ما هو الكائن غير القابل للتغيير (الكائن غير القابل للتغيير)، وما هي فوائد الكائنات غير القابلة للتغيير، وتحت أي ظروف يجب استخدامه؟ أو بشكل أكثر تحديدًا، لماذا يجب تعيين فئة السلسلة في Java إلى نوع غير قابل للتغيير؟
الكائنات غير القابلة للتغيير، كما يوحي الاسم، هي كائنات لا يمكن تغييرها بعد الإنشاء. والمثال النموذجي هو فئة السلسلة في Java.
انسخ رمز الكود كما يلي:
سلسلة ق = "أبك"؛
s.toLowerCase();
كما هو مذكور أعلاه، لا يغير s.toLowerCase() قيمة "ABC"، ولكنه ينشئ فئة سلسلة جديدة "abc" ثم يوجه المثيل الجديد إلى المتغير s.
تتمتع الكائنات غير القابلة للتغيير بالعديد من المزايا مقارنة بالكائنات القابلة للتغيير:
1). يمكن للكائنات غير القابلة للتغيير تحسين كفاءة وسلامة String Pool. إذا كنت تعلم أن الكائن غير قابل للتغيير، فعندما تحتاج إلى نسخ محتويات الكائن، فلن تحتاج إلى نسخه بنفسه، ولكن يتطلب نسخ العنوان (عادةً بحجم المؤشر) القليل جدًا من الذاكرة وهو فعال للغاية . ولن يؤثر على المتغيرات الأخرى التي تشير إلى "ABC" في نفس الوقت.
2). تعتبر الكائنات غير القابلة للتغيير آمنة للخيوط المتعددة، لأنه عند تشغيل سلاسل رسائل متعددة في نفس الوقت، من المحتمل أن تتغير قيمة الكائن القابل للتغيير بواسطة عمليات أخرى، مما سيؤدي إلى نتائج غير متوقعة، واستخدام الكائنات غير القابلة للتغيير هو هذا. يمكن تجنب الوضع.
بالطبع، هناك أسباب أخرى، ولكن السبب الأكبر وراء تعيين Java للسلسلة على أنها غير قابلة للتغيير هو الكفاءة والأمان.
الإجابة على اثنين:
هذا سؤال قديم ولكنه لا يزال شائعًا، إن تصميم السلسلة لتكون غير قابلة للتغيير في Java هو نتيجة أخذ عوامل مختلفة في الاعتبار، لفهم هذه المشكلة، تحتاج إلى دمج الاعتبارات الهيكلية والسلامة في ما يلي ، سأقدم ملخصًا للأسباب المختلفة.
1. الحاجة إلى تجمع ثابت للسلسلة
تجمع السلسلة الثابت (تجمع السلسلة، تجمع السلسلة الداخلي، تجمع الاحتفاظ بالسلسلة) هو منطقة تخزين خاصة في ذاكرة كومة Java. عند إنشاء كائن سلسلة، إذا كانت قيمة السلسلة موجودة بالفعل في التجمع الثابت، فلن يتم إنشاؤها مرة أخرى كائن، ولكن إشارة إلى كائن موجود.
كما هو موضح في التعليمة البرمجية التالية، سيتم إنشاء كائن سلسلة فعلي واحد فقط في ذاكرة الكومة.
انسخ رمز الكود كما يلي:
سلسلة s1 = "abcd";
سلسلة s2 = "abcd";
الرسم التخطيطي هو كما يلي:
إذا تم السماح لكائن السلسلة بالتغيير، فسيؤدي ذلك إلى أخطاء منطقية مختلفة، على سبيل المثال، سيؤثر تغيير كائن على كائن مستقل آخر. وبالمعنى الدقيق للكلمة، فإن فكرة هذا التجمع الثابت هي طريقة تحسين.
يرجى التفكير: إذا كان الكود كما يلي، فهل سيظل s1 وs2 يشيران إلى نفس كائن السلسلة الفعلي؟
انسخ رمز الكود كما يلي:
سلسلة s1= "ab" + "cd";
سلسلة s2= "abc" + "d";
ربما يكون هذا السؤال غير بديهي للمبتدئين، ولكن بالنظر إلى أن المترجمين الحديثين سيجرون تحسينات منتظمة، فسوف يشيرون جميعًا إلى نفس الكائن في التجمع الثابت. وبدلاً من ذلك، يمكنك استخدام أدوات مثل jd-gui لعرض مستند الفصل المترجم.
2. السماح لكائنات السلسلة بتخزين HashCode مؤقتًا
يتم استخدام رمز التجزئة لكائنات السلسلة في Java بشكل متكرر، كما هو الحال في الحاويات مثل hashMap.
تضمن ثبات السلسلة تفرد رمز التجزئة، بحيث يمكن تخزينه مؤقتًا بثقة، وهذه أيضًا طريقة لتحسين الأداء، مما يعني أنه ليست هناك حاجة لحساب رمز تجزئة جديد في كل مرة يوجد الكود التالي في التعريف من فئة السلسلة:
انسخ رمز الكود كما يلي:
تجزئة int خاصة؛// تُستخدم للتخزين المؤقت لـ HashCode
3. الأمن
يتم استخدام السلسلة كمعلمة من قبل العديد من فئات Java (المكتبات)، مثل عنوان URL لعنوان اتصال الشبكة ومسار الملف ومعلمات السلسلة التي تتطلبها آلية الانعكاس. إذا لم يتم إصلاح السلسلة، فسوف يتسبب ذلك في مخاطر أمنية مختلفة.
إذا كان هناك الكود التالي:
انسخ رمز الكود كما يلي:
اتصال منطقي (سلسلة ق) {
إذا (!isSecure(s)) {
طرح SecurityException () جديد ؛
}
// إذا كان من الممكن تعديل السلسلة في مكان آخر، فستحدث هنا مشكلات/أخطاء متنوعة غير متوقعة.
سبب المشكلة (المشاكل)؛
}
بشكل عام، الأسباب التي تجعل السلسلة غير قابلة للتغيير تشمل اعتبارات التصميم، وقضايا تحسين الكفاءة، والأمان. في الواقع، هذا أيضًا هو الجواب على العديد من "الأسباب" في مقابلات Java.
الإجابة 3: فوائد ثبات فئة السلسلة
السلسلة هي الفئة الأكثر استخدامًا في جميع اللغات. نحن نعلم أن السلسلة في Java غير قابلة للتغيير ونهائية. تقوم Java أيضًا بحفظ مجموعة String في وقت التشغيل، مما يجعل String فئة خاصة.
فوائد ثبات فئة السلسلة
1. تجميع السلاسل يكون ممكنًا فقط عندما تكون السلاسل غير قابلة للتغيير. يمكن أن يؤدي تنفيذ تجمع السلسلة إلى توفير الكثير من مساحة الكومة في وقت التشغيل، لأن متغيرات السلسلة المختلفة تشير إلى نفس السلسلة في التجمع. ولكن إذا كانت السلسلة متغيرة، فلن يكون تدريب السلسلة ممكنًا (ملاحظة المترجم: تدريب السلسلة يعني أنه تم حفظ سلسلة واحدة مختلفة فقط، أي لن يتم حفظ عدة سلاسل متطابقة.)، لأنه في هذه الحالة، إذا كان متغير يغير قيمته، ستتغير أيضًا قيم المتغيرات الأخرى التي تشير إلى هذه القيمة.
2. إذا كانت السلسلة متغيرة، فسوف تسبب مشاكل أمنية خطيرة. على سبيل المثال، يتم تمرير اسم المستخدم وكلمة المرور لقاعدة البيانات كسلاسل للحصول على اتصال قاعدة البيانات، أو في برمجة المقبس، يتم تمرير اسم المضيف والمنفذ كسلاسل. نظرًا لأن السلسلة غير قابلة للتغيير، فلا يمكن تغيير قيمتها، وإلا يمكن للمتسللين استغلال الثغرات وتغيير قيمة الكائن الذي تشير إليه السلسلة، مما يتسبب في ثغرة أمنية.
3. نظرًا لأن السلاسل غير قابلة للتغيير، فهي آمنة متعددة الخيوط، ويمكن مشاركة نفس مثيل السلسلة بواسطة سلاسل رسائل متعددة. وهذا يلغي الحاجة إلى استخدام المزامنة بسبب مشكلات سلامة الخيط. السلاسل نفسها آمنة للخيوط.
4. تستخدم أدوات تحميل الفئة السلاسل، وتوفر عدم قابلية التغيير الأمان بحيث يتم تحميل الفئة الصحيحة. على سبيل المثال، إذا كنت تريد تحميل فئة java.sql.Connection، وتم تغيير هذه القيمة إلى myhacked.Connection، فسوف يتسبب ذلك في تلف غير معروف لقاعدة البيانات الخاصة بك.
5. نظرًا لأن السلسلة غير قابلة للتغيير، يتم تخزين رمز التجزئة مؤقتًا عند إنشائه ولا يحتاج إلى إعادة حسابه. وهذا يجعل السلاسل مناسبة جدًا كمفاتيح في الخرائط، ويمكن معالجة السلاسل بشكل أسرع من الكائنات الرئيسية الأخرى. هذا هو السبب في أن المفاتيح في HashMap غالبًا ما تستخدم السلاسل.
ما ورد أعلاه هو ملخصي لفوائد ثبات السلسلة.