تنظم هذه المقالة بشكل أساسي أسئلة مقابلة Java المشتركة للرجوع إليها. المحتوى المحدد كما يلي
1. الفرق بين النوم والانتظار في جافا
① تأتي هاتان الطريقتان من فئات مختلفة ، يأتي النوم من فئة الخيط ، والانتظار يأتي من فئة الكائن.
النوم هو طريقة فئة ثابتة للخيط. من يسميه يذهب للنوم. حتى لو تم استدعاء طريقة نوم B في الموضوع A ، فإنها لا تزال تنام بالفعل. لجعل الموضوع ب النوم ، عليك الاتصال بالنوم في رمز ب.
② القفل: أهم شيء هو أن طريقة النوم لا تطلق القفل ، في حين أن طريقة الانتظار تطلق القفل ، بحيث يمكن لخيوط أخرى استخدام كتل أو طرق تحكم متزامنة.
النوم لا ينقل موارد النظام ؛ انتظر للدخول إلى تجمع انتظار الخيط للانتظار ، وموارد نظام النقل ، ويمكن أن تشغل مؤشرات الترابط الأخرى وحدة المعالجة المركزية. بشكل عام ، لن يضيف الانتظار حد زمني ، لأنه إذا تم تشغيل مؤشر ترابط الانتظار في موارد غير كافية ، فسيكون من غير المجدي الخروج مرة أخرى. يجب عليك الانتظار حتى تتصل سلاسل الرسائل الأخرى بإخطار/إخطار باستيقاظ جميع المواضيع في تجمع الانتظار قبل إدخال قائمة الانتظار جاهزة وانتظار نظام التشغيل لتخصيص موارد النظام. يمكن تحديد Sleep (milliseconds) لإيقاظه تلقائيًا. إذا كان الوقت أقل من الوقت ، فيمكنك فقط استدعاء Interrupt () لفرض المقاطعة.
تتمثل وظيفة thread.sleep (0) في "تشغيل نظام التشغيل لإعادة تجميع وحدة المعالجة المركزية مرة أخرى".
③ نطاق الاستخدام: لا يمكن استخدام الانتظار والإخطار والإخطار إلا في طرق التحكم في المزامنة أو كتل التحكم في المزامنة ، بينما يمكن استخدام النوم في أي مكان.
متزامن (x) {x.notify () // أو wait ()}2. الفرق بين hashmap و hashtable في جافا
① الأسباب التاريخية: يتم إعطاء علامة التجزئة للطبقة المدنية القديمة. HashMap هو تطبيق واجهة الخريطة التي أدخلتها Java 1.2.
② يتيح HashMap أزواج القيمة الرئيسية الفارغة ، في حين أن علامة التجزئة لا
③ تزامن التجزئة ، في حين أن hashmap غير المتزامن أكثر كفاءة من الهاشت
3. يرجى وصف الفرق بين الرمي والرميات بإيجاز
① يمثل رمي العمل ، مما يعني أنه يتم إلقاء استثناء ؛ تمثل الرميات حالة ، مما يعني أن الطريقة قد يكون لها استثناء يتم استخدام ② رمي في تنفيذ الطريقة ، في حين يتم استخدام الرميات في إعلان الطريقة ③ لا يمكن استخدام رمي إلا لرمي استثناء واحد ، في حين أن الرميات يمكن أن ترمي استثناءات متعددة
4. الفرق بين تجاوز الذاكرة وتسرب الذاكرة
يشير الفطائر في الذاكرة خارج الذاكرة إلى حقيقة أنه عندما يطبق البرنامج للذاكرة ، لا يوجد مساحة ذاكرة كافية لاستخدامها ، ويظهر خارج الذاكرة ؛ على سبيل المثال ، إذا تم تطبيق عدد صحيح ولكنه يمكن أن ينقذ لفترة طويلة ، فهو تفوق على الذاكرة.
يشير تسرب تسرب الذاكرة إلى عدم قدرة البرنامج على تحرير مساحة الذاكرة التي تم تطبيقها بعد التقدم بطلب للحصول على الذاكرة. يمكن تجاهل ضرر تسرب الذاكرة ، ولكن عواقب تراكم تسرب الذاكرة خطيرة للغاية. بغض النظر عن مقدار الذاكرة ، سيتم شغلها عاجلاً أم آجلاً.
سيؤدي تسرب الذاكرة في النهاية إلى الخروج من الذاكرة!
تعني الفائض من الذاكرة أن الذاكرة التي تحتاجها لتخصيص تتجاوز ما يمكن أن يعطيك النظام ، ولا يمكن للنظام تلبية الاحتياجات ، لذلك يحدث الفائض.
تكون تسرب الذاكرة عندما تتقدم إلى النظام لتخصيص الذاكرة للاستخدام (جديد) ، ولكن بعد الاستخدام ، لا يعود (حذف). نتيجة لذلك ، لم يعد بإمكانك الوصول إلى الذاكرة التي تقدمت إليها (ربما فقدت عنوانها) ، ولا يمكن للنظام تخصيصه للبرنامج المطلوب مرة أخرى. إذا كنت تستخدم جميع الطرق لملء لوحة ، فيمكنك فقط الاحتفاظ بـ 4 ثمار. إذا ملأت 5 ، فسوف تسقط على الأرض ولا يمكنك تناولها. هذا فاخرة! على سبيل المثال ، إذا كانت المكدس ممتلئًا ، فسوف يتسبب حتماً في تدفق الفضاء عندما يكون المكدس ممتلئًا ، والذي يسمى الفائض. إذا كانت المكدس فارغًا ، فسيؤدي ذلك أيضًا إلى تفوق الفضاء عندما يكون المكدس فارغًا ، والذي يسمى Underflow. وهذا يعني أن الذاكرة المخصصة ليست كافية لإخماد تسلسل عناصر البيانات ، والتي تسمى فيضان الذاكرة.
التصنيف بالطريقة التي تحدث ، يمكن تقسيم تسرب الذاكرة إلى 4 فئات:
① تسرب الذاكرة المتكرر. سيتم تنفيذ الكود الذي يحدث مع تسرب الذاكرة عدة مرات ، وفي كل مرة يتم تنفيذه ، سيؤدي ذلك إلى تسرب ذاكرة.
② تسرب الذاكرة في بعض الأحيان. لن يحدث الكود الذي يحدث مع تسرب الذاكرة إلا في بيئات أو عمليات محددة. منتظمة وعرضية نسبية. بالنسبة لبيئة محددة ، قد تصبح مناسبة متكررة. لذلك ، تعد بيئة الاختبار وطرق الاختبار أمرًا بالغ الأهمية لاكتشاف تسرب الذاكرة.
③ تسرب الذاكرة لمرة واحدة. لن يتم تنفيذ الكود الذي يحدث مع تسرب الذاكرة إلا مرة واحدة ، أو بسبب العيوب الخوارزمية ، سيكون هناك دائمًا جزء واحد من تسرب الذاكرة. على سبيل المثال ، يتم تخصيص الذاكرة في مُنشئ الفصل ، ولكن لم يتم إصدار الذاكرة في المدمرة ، لذلك تحدث تسرب الذاكرة مرة واحدة فقط.
④ تسرب الذاكرة الضمني. يخصص البرنامج للذاكرة بشكل مستمر أثناء التشغيل ، لكنه لا يطلق الذاكرة حتى يتم الانتهاء منه. بالمعنى الدقيق للكلمة ، لا يوجد تسرب ذاكرة هنا لأن البرنامج يحرر في النهاية جميع الذاكرة المطلوبة. ولكن بالنسبة لبرنامج الخادم ، فإن الأمر يستغرق عدة أيام أو أسابيع أو حتى أشهر للتشغيل ، ولا يمكن أن يؤدي تحرير الذاكرة في الوقت المناسب إلى نهاية مرهقة جميع الذاكرة في النظام. لذلك ، نسمي هذا النوع من الذاكرة تسرب تسرب ذاكرة ضمني.
من منظور المستخدمين الذين يستخدمون البرامج ، لن يسبب تسرب الذاكرة أنفسهم أي ضرر. كمستخدم عادي ، لا يمكنك أن تشعر بوجود تسرب الذاكرة على الإطلاق. ما هو ضار حقًا هو تراكم تسرب الذاكرة ، والذي سيستهلك في النهاية كل الذاكرة في النظام. من هذا المنظور ، لا تكون تسرب الذاكرة لمرة واحدة ضارة لأنها لا تتراكم ، في حين أن تسرب الذاكرة الضمنية ضار للغاية لأنها أكثر صعوبة في اكتشافها من تسرب الذاكرة المتكرر والمكتب.
5. الفرق بين السلسلة ، StringBuffer و StringBuilder
① متغير وغير قابل للتغيير
يستخدم فئة السلسلة مجموعة أحرف لحفظ السلاسل ، على النحو التالي: نظرًا لوجود معدل "نهائي" ، يمكنك معرفة أن كائنات السلسلة غير قابلة للتغيير.
قيمة char النهائية الخاصة [] ؛
كل من StringBuilder و StringBuffer موروثة من فئة AbstractStringBuilder. في AbstractStringBuilder ، يتم استخدام صفائف الأحرف لحفظ السلاسل. على النحو التالي ، يمكن ملاحظة أن كلا الكائنين قابلة للتغيير.
char [] القيمة ؛
② هل هي متعددة الخيوط وآمنة
الكائنات الموجودة في السلسلة غير قابلة للتغيير ، بحيث يمكن فهمها على أنها ثوابت ، والتي من الواضح أنها آمنة للخيط.
AbstractStringBuilder هي فئة من الوالدين العامين من StringBuilder و StringBuffer ، والتي تحدد بعض العمليات الأساسية للسلاسل ، مثل SextedCapity ، إلحاق ، إدراج ، فهرس وغيرها من الأساليب العامة.
يحتوي StringBuffer على قفل المزامنة على الطريقة أو قفل التزامن على الطريقة المدعو ، لذلك فهو آمن مؤشر الترابط. انظر رمز المصدر التالي:
SuperSbuffer stringBuffer العكسي () {super.reverse () ؛ إرجاع هذا ؛ } public int indexof (String str) {return indexof (str ، 0) ؛ // هناك طريقة int متزامنة عامة (String str ، int fromIndex)} لا يضيف StringBuilder أقفال المزامنة إلى هذه الطريقة ، لذلك فهو غير آمن.
③stringBuilder و stringBuffer مشترك
StringBuilder و StringBuffer لديهم فئات الوالدين العامة AbstractStringBuilder (فئة مجردة).
أحد الاختلافات بين الطبقات المجردة والواجهات هو أنه يمكن تعريف بعض الأساليب العامة للفئات الفرعية في الفئات المجردة. تحتاج الفئات الفرعية فقط إلى إضافة وظائف جديدة ولا تحتاج إلى تكرار الأساليب الحالية ؛ بينما تحدد الواجهات الأساليب والثوابت فقط.
ستتصل طرق StringBuilder و StringBuffer بالأساليب العامة في AbstractStringBuilder ، مثل Super.Append (...). إنها فقط ستضيف StringBuffer الكلمة الرئيسية المتزامنة إلى الطريقة وتنفيذ المزامنة.
أخيرًا ، إذا لم يكن البرنامج متعددًا ، فإن استخدام StringBuilder يكون أكثر كفاءة من StringBuffer.
6. الفرق بين المصفوفات والقوائم المرتبطة
كلاهما ينتمي إلى بنية البيانات
من الهيكل المنطقي:
① يجب أن يحدد الصفيف طولًا ثابتًا (عدد العناصر) مقدمًا ، ولا يمكنه التكيف مع الزيادة الديناميكية وتقليل البيانات. عندما تزداد البيانات ، قد يتجاوز عدد العناصر المحددة في الأصل ؛ عندما تنخفض البيانات ، سيتم حدوث نفايات الذاكرة ؛ يمكن الوصول إلى الصفيف بشكل مباشر وفقًا للمنفذ.
② يتم تخزين القائمة المرتبطة وتخصيصها ديناميكيًا ، والتي يمكن أن تتكيف مع الزيادة الديناميكية وتقليل البيانات ، ويمكنها بسهولة إدراج وحذف عناصر البيانات. (عند إدخال وحذف عناصر البيانات في الصفيف ، تحتاج إلى نقل عناصر بيانات أخرى ، وهي مرهقة للغاية) يجب أن تجد القائمة المرتبطة العنصر التالي وفقًا للمؤشر التالي.
من تخزين الذاكرة:
① المصفوفات (الثابتة) تخصيص مساحة من المكدس ، وهو مريح وسريع للمبرمجين ، ولكن لديه القليل من الحرية.
② تخصص القائمة المرتبطة المساحة من الكومة ، التي لديها الكثير من الحرية ولكنها أكثر إثارة للقلق للتقدم للتقدم للتقدم بطلب للحصول على الإدارة.
من المقارنة أعلاه ، يمكننا أن نرى أنه إذا كنت بحاجة إلى الوصول بسرعة إلى البيانات ونادراً ما يتم إدخال العناصر وحذفها ، فيجب عليك استخدام صفيف ؛ على العكس من ذلك ، إذا كنت بحاجة إلى إدراج وحذف العناصر بشكل متكرر ، فأنت بحاجة إلى استخدام بنية بيانات قائمة مرتبطة.
7. الفرق بين ArrayList و LinkedList
①arrayList تقوم بتنفيذ بنية بيانات تعتمد على المصفوفات الديناميكية ، ويستند LinkedList على بنية بيانات تعتمد على قائمة مرتبطة.
② للوصول العشوائي إلى Get and Set ، يشعر ArrayList بأنه أفضل من LinkedList لأن LinkedList يحتاج إلى نقل المؤشر.
③ لإضافة عمليات الإضافة والحذف وإزالتها ، يتمتع LiningList بميزة نسبيًا لأن ArrayList يحتاج إلى نقل البيانات.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.