CodeGym /مدونة جافا /Random-AR /استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java. ...
John Squirrels
مستوى
San Francisco

استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java. الجزء 2

نشرت في المجموعة
مرحبا مرة أخرى، الجميع! نواصل البحث عن إجابات لأسئلة مطوري Java المبتدئين والمتوسطين وكبار السن. الأسئلة مثيرة للاهتمام للغاية. أنا شخصياً أحب تحليلها، لأنها تساعدني في العثور على الثغرات في معرفتي النظرية، وفي أماكن غير متوقعة في بعض الأحيان. استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 2 - 1الجزء السابق تجدونه في هذه المقالة . ولكن قبل أن نبدأ، أريد أن أذكرك بما يلي:
  1. سأتخطى الأسئلة التي تتداخل مع هذه السلسلة من المقالات حتى لا أكرر المعلومات دون داع. أوصي بقراءة هذه المقالات لأنها تغطي الأسئلة الأكثر شيوعًا (الشعبية) لمقابلة Java Core.
  2. يمكنني أن أصف الإجابات بمزيد من التفصيل، لكنني لن أفعل ذلك، لأن كل إجابة يمكن أن تستمر في المقالة بأكملها. ولن يطلب منك أحد هذا المستوى من التفاصيل في أي مقابلة عمل.
سأترك روابط للدراسة الأعمق إذا كنت تريد. لنطير!

11. قم بتسمية كافة أساليب فئة الكائن

تحتوي فئة الكائن على 11 طريقة:
  1. Class<?> getClass() — احصل على فئة الكائن الحالي؛

  2. int hashCode() — الحصول على رمز التجزئة للكائن الحالي؛

  3. منطقية يساوي (Object obj) - مقارنة الكائن الحالي مع كائن آخر؛

  4. كائن استنساخ () - إنشاء وإرجاع نسخة من الكائن الحالي؛

  5. String toString() — احصل على تمثيل السلسلة للكائن؛

  6. void notify () — تنبيه خيط واحد ينتظر على شاشة هذا الكائن (اختيار الخيط عشوائي)؛

  7. void notifyAll () - تنبيه كافة المواضيع المنتظرة على شاشة هذا الكائن؛

  8. انتظار باطلة () - جعل الخيط الحالي ينتظر على الشاشة الحالية (تجميد الخيط الحالي) حتى يقوم استدعاء الإخطار أو notifyAll بإيقاظ الخيط (يعمل فقط في كتلة متزامنة)؛

  9. انتظار باطلة (مهلة طويلة) - جعل الخيط الحالي ينتظر على الشاشة الحالية (على الكتلة المتزامنة الحالية)، ولكن مع مهلة للخروج من حالة الانتظار (أو مرة أخرى، حتى يستيقظ تنبيه أو مكالمة notifyAll الخيط)؛

  10. الانتظار الفارغ (مهلة طويلة، int nanos) - تشبه هذه الطريقة الطريقة السابقة، ولكن مع مهلة أكثر دقة؛

  11. void Finalize() - يتم استدعاء هذه الطريقة (أخيرًا) قبل أن تتم إزالة الكائن بواسطة أداة تجميع البيانات المهملة. يتم استخدامه لتنظيف الموارد المكتسبة.

لاستخدام أساليب hashCode و equals و clone و toString ووضع اللمسات النهائية بشكل صحيح، يجب تجاوزها وفقًا لتفاصيل المهمة الحالية.

12. ما الفرق بين تجربة الموارد ومحاولة الالتقاط أخيرًا عند العمل باستخدام الموارد؟

عادة، عند استخدام Try-catch-finally ، يتم استخدام الكتلة النهائية لإغلاق الموارد. يقدم Java 7 بيان المحاولة باستخدام الموارد الجديد . إنه مشابه لـ حاول الالتقاط أخيرًا لتحرير الموارد، ولكنه أكثر إحكاما وقابلية للقراءة. دعونا نتذكر كيف تبدو محاولة الالتقاط أخيرًا :
String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
   bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
} finally {
   try {
       bufferedWriter.close();
   } catch (IOException e) {
       e.printStackTrace();
   }
}
لنعد الآن كتابة هذا الكود، لكن باستخدام Try-with-resources :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
}
الآن أصبح الأمر أبسط إلى حدٍ ما، ألا تعتقد ذلك؟ بالإضافة إلى الكود الأبسط، هناك بعض النقاط الأخرى التي يجب ملاحظتها:
  1. في Try-with-resources ، يجب أن تقوم الموارد المعلنة بين القوسين (الموارد التي سيتم إغلاقها) بتنفيذ الواجهة AutoCloseable وطريقة الإغلاق الوحيدة الخاصة بها .

    يتم تنفيذ طريقة الإغلاق في كتلة ضمنية أخيرًا ، وإلا كيف سيكتشف البرنامج بالضبط كيفية إغلاق المورد؟

    ولكن ربما نادرًا ما تكتب تطبيقاتك الخاصة للموارد وطريقة إغلاقها.

  2. يتم تنفيذ الكتل بهذا الترتيب:

    1. كتلة المحاولة .
    2. الكتلة الضمنية أخيرًا .
    3. كتلة الالتقاط ، التي تلتقط الاستثناءات التي تحدث في الخطوات السابقة.
    4. الكتلة الصريحة أخيرًا .

    كقاعدة عامة، الاستثناءات التي يتم طرحها في أسفل القائمة تقاطع تلك التي يتم طرحها في أعلى القائمة.

تخيل أنك تستخدم محاولة الالتقاط أخيرًا وحصلت على استثناء في كتلة المحاولة . ثم يبدأ تنفيذ كتلة الالتقاط المحددة على الفور، حيث كتبنا استثناءً آخر (على سبيل المثال، مع رسالة تصف الخطأ بمزيد من التفاصيل)، وتريد أن تقوم الطريقة بطرح هذا الاستثناء لأعلى. ثم يتم تنفيذ الكتلة النهائية ، ويتم طرح استثناء فيها أيضًا. لكن واحدة مختلفة هذه المرة. أي من هذين الاستثناءين ستطرحه هذه الطريقة في النهاية؟ الاستثناء الذي طرحته الكتلة أخيرًا ! لكننا وصلنا الآن إلى نقطة أخرى تتعلق بتجربة الموارد . دعونا نفكر في كيفية سلوك المحاولة باستخدام الموارد في نفس الموقف. نحصل على استثناء في كتلة المحاولة عند محاولة إغلاق الموارد بطريقة Close() ، أي في الكتلة الضمنية أخيرًا . أي من هذه الاستثناءات سوف تلتقطها كتلة الالتقاط ؟ الذي ألقيته كتلة المحاولة ! سيتم تجاهل الاستثناء من الكتلة الضمنية أخيرًا (من طريقة Lose () ). ويسمى هذا التجاهل للاستثناءات أيضًا بقمع الاستثناءات.

13. ما هي العمليات المتعلقة بالبت؟

عمليات Bitwise هي عمليات تتم على تسلسلات من البتات. وهي تشمل العمليات المنطقية والتحولات في اتجاه البت. العوامل المنطقية:
  • bitwise AND - يقارن قيم البت. أي بت يتم ضبطه على 0 (خطأ) يضبط البت المقابل في النتيجة على 0. أي أنه إذا كان البت هو 1 (صحيح) في كلتا القيمتين المقارنة، فإن البت الناتج سيكون أيضًا 1.

    يُشار إليه بـ AND أو &

    مثال: 10111101 & 01100111 = 00100101

  • bitwise OR - هذه العملية هي عكس العملية السابقة. أي بت يتم ضبطه على 1 يؤدي إلى تعيين البت المقابل في النتيجة إلى 1. وبناءً على ذلك، إذا كانت البتة 0 في كلا القيمتين المقارنتين، فإن البت الناتج سيكون أيضًا 0.

    يُشار إليه بـ OR أو |

    مثال: 10100101 | 01100011 = 11100111

  • bitwise NOT — يتم تطبيق هذا العامل على قيمة واحدة. إنه يقلب (يقلب) البتات. أي أن البتات التي كانت 1 تصبح 0؛ وتلك التي كانت 0 تصبح 1.

    يُشار إليه بـ NOT أو ~

    مثال: ~10100101 = 01011010

  • حصريًا للبت OR — يقارن قيم البت. إذا كان كلا البتين 1، فإن البت الناتج هو 0. وإذا كان كلا البتين 0، فإن البت الناتج هو 0. وبعبارة أخرى، لكي يكون البت الناتج 1، يجب أن تكون واحدة فقط من البتات 1، و يجب أن يكون البت الآخر 0.

    يُشار إليه بـ XOR أو ^

    مثال: 10100101 ^ 01100011 = 11000110

تعمل إزاحات اتجاه البت ( >> و << ) على إزاحة بتات المعامل في الاتجاه المحدد، بعدد محدد من الأماكن. المناصب الشاغرة مليئة بالأصفار. على سبيل المثال:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
الاستثناء هو عندما تقوم بإزاحة رقم سالب إلى اليمين. كما تتذكر، فإن البت الأول من الرقم الموقع يشير إلى الإشارة. إذا كان هذا البت هو 1، فإن الرقم يكون سالبًا. إذا قمت بإزاحة رقم سالب، فلن يتم ملء المواضع الشاغرة بالأصفار، بل بالأحرى، حيث يجب الحفاظ على بت الإشارة. على سبيل المثال: 10100010 >> 2 = 11101000، ومع ذلك، تحتوي Java على عامل تشغيل إضافي غير موقع لليمين (>>>). هذا العامل مشابه لـ >>، ولكن عند إزاحته، يتم ملء المواضع الفارغة بـ 0، بغض النظر عما إذا كان المعامل رقمًا سالبًا أو رقمًا موجبًا. على سبيل المثال: 10100010 >>> 2 = 00101000 اقرأ المزيد عن عمليات البت هنا . استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 2 - 2يمكنك استخدام طريقة التجزئة () في HashMaps كمثال على التحولات في اتجاه البت في Java. تُستخدم هذه الطريقة لتحديد رمز التجزئة الداخلي الخاص بالمفتاح: استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 2 - 3تتيح لك هذه الطريقة توزيع البيانات بالتساوي في HashMap، لتقليل عدد التصادمات.

14. ما هي الكائنات القياسية غير القابلة للتغيير الموجودة في Java؟

يكون الكائن غير قابل للتغيير إذا لم يسمح بتغير قيمه الأصلية. قد تحتوي على طرق تُرجع كائنات جديدة من نفس النوع بقيم مختلفة. تتضمن بعض الكائنات القياسية غير القابلة للتغيير ما يلي:
  • مما لا شك فيه أن النوع الأكثر شهرة غير القابل للتغيير في Java هو String؛
  • مثيلات فئات المجمع التي تغلف الأنواع القياسية: Boolean، Character، Byte، Short، Integer، Long، Double، Float؛
  • كائنات BigInteger وBigDecimal، والتي تُستخدم عادةً للأرقام الكبيرة بشكل خاص؛
  • كائنات StackTraceElement التي تشكل تتبع المكدس (على سبيل المثال، تتبع المكدس للاستثناء)؛
  • كائن من فئة الملف - يمكنه تعديل الملفات، ولكن في نفس الوقت يظل الكائن نفسه دون تغيير؛
  • UUIDs، والتي غالبًا ما تستخدم لتعريف العناصر بشكل فريد؛
  • جميع كائنات الفئات في حزمة java.time؛
  • الكائنات المحلية، والتي تستخدم لتحديد منطقة جغرافية أو سياسية أو ثقافية.

15. ما هي مميزات الأشياء غير القابلة للتغيير عن الأشياء العادية؟

  1. تعتبر الكائنات غير القابلة للتغيير آمنة للاستخدام في بيئة متعددة مؤشرات الترابط . إنهم يقومون بذلك حتى لا تقلق بشأن فقدان البيانات بسبب ظروف السباق. وهذا يختلف عن العمل مع كائنات عادية. في هذه الحالة، عليك أن تفكر وتتوصل إلى آليات جيدة عند استخدام الكائن في بيئة موازية.

  2. الكائنات غير القابلة للتغيير جيدة كمفاتيح في الخريطة. إذا كنت تستخدم كائنًا قابلاً للتغيير كمفتاح HashMap ثم تغيرت حالة الكائن، فقد يتم الخلط بين بنية البيانات: سيظل الكائن موجودًا، ولكن إذا كنت تستخدم يحتوي على Key()، فقد لا تجده.

  3. تعتبر الكائنات غير القابلة للتغيير رائعة لتخزين البيانات غير القابلة للتغيير (الثابتة) التي لا ينبغي تغييرها أبدًا أثناء تشغيل البرنامج.

  4. ميزة أخرى هي ذرية الفشل. إذا طرح كائن غير قابل للتغيير استثناءً، فلن يتم تركه في حالة غير مرغوب فيها (مكسورة).

  5. من السهل اختبار هذه الفئات.

  6. لا تحتاج إلى أي آليات إضافية مثل مُنشئ النسخ أو تنفيذ استنساخ الكائنات.

أسئلة حول OOP

16. ما هي مميزات OOP بشكل عام ومقارنتها بالبرمجة الإجرائية؟

حسنًا، مميزات OOP:
  1. تعد كتابة التطبيقات المعقدة باستخدام OOP أسهل من البرمجة الإجرائية حيث يتم تقسيم كل شيء إلى وحدات صغيرة - كائنات تتفاعل مع بعضها البعض - ونتيجة لذلك، يتم تقليل البرمجة إلى العلاقات بين الكائنات.

  2. تعد التطبيقات المكتوبة باستخدام OOP أسهل بكثير في التعديل (عند مراعاة مبادئ التصميم بشكل صحيح).

  3. نظرًا لأن كل من البيانات وعمليات البيانات تشكل كيانًا واحدًا، فلا يتم تلطيخها في جميع أنحاء التطبيق (وهو ما يحدث غالبًا في البرمجة الإجرائية).

  4. مبدأ التغليف يحمي البيانات الأكثر أهمية من المستخدم.

  5. يمكن إعادة استخدام نفس الكود مع بيانات مختلفة لأن الفئات تتيح لك إنشاء العديد من الكائنات، لكل منها قيمها الخاصة.

  6. يتيح لك الوراثة وتعدد الأشكال أيضًا إعادة استخدام التعليمات البرمجية الموجودة وتوسيعها (بدلاً من تكرار وظائف مماثلة).

  7. يعد توسيع الطلب أبسط من النهج الإجرائي.

  8. يتيح نهج OOP استخلاص تفاصيل التنفيذ.

17. أخبرنا ما هي عيوب OOP

ولسوء الحظ، فهي موجودة أيضا:
  1. يتطلب OOP الكثير من المعرفة النظرية التي يجب إتقانها قبل أن تتمكن من كتابة أي شيء.

  2. ليس من السهل فهم أفكار OOP وتطبيقها في الممارسة العملية (يجب أن تكون فيلسوفًا صغيرًا في القلب).

  3. يؤدي OOP إلى تقليل أداء البرنامج قليلاً بسبب زيادة تعقيد النظام.

  4. يتطلب أسلوب OOP ذاكرة أكبر نظرًا لأن كل شيء يتكون من فئات وواجهات وأساليب تشغل ذاكرة أكبر بكثير من المتغيرات العادية.

  5. الوقت اللازم للتحليل الأولي أكبر من الوقت اللازم للنهج الإجرائي.

18. ما هو تعدد الأشكال الساكن مقابل تعدد الأشكال الديناميكي؟

يسمح تعدد الأشكال للكائنات من نفس الفئة أو الواجهة بالتصرف بشكل مختلف. هناك نوعان من تعدد الأشكال، المعروفين أيضًا بالربط المبكر والمتأخر. تعدد الأشكال الساكن، أو الارتباط المبكر:
  • يحدث في وقت الترجمة (في وقت مبكر من دورة حياة البرنامج)؛
  • يقرر الطريقة التي سيتم تنفيذها في وقت الترجمة؛
  • تعد طريقة التحميل الزائد مثالاً على تعدد الأشكال الساكن؛
  • يتضمن الربط المبكر طرقًا خاصة وثابتة ونهائية؛
  • لا يشارك الميراث في الارتباط المبكر؛
  • لا يتضمن تعدد الأشكال الثابت كائنات محددة، بل معلومات حول نوع الفئة التي تظهر على يسار اسم المتغير.
تعدد الأشكال الديناميكي، أو الارتباط المتأخر:
  • يحدث في وقت التشغيل (أثناء تشغيل البرنامج)؛
  • يقرر تعدد الأشكال الديناميكي التنفيذ المحدد الذي ستطبقه الطريقة في وقت التشغيل؛
  • يعد تجاوز الطريقة مثالاً على تعدد الأشكال الديناميكي؛
  • الربط المتأخر يعني تعيين كائن محدد، أو مرجع من نوعه، أو فئته الفائقة؛
  • يرتبط الميراث بتعدد الأشكال الديناميكي.

19. تقديم تعريف لمبدأ التجريد في OOP

في OOP، التجريد هو وسيلة لعزل مجموعة من الخصائص ذات المعنى لكائن ما، مع استبعاد التفاصيل غير المهمة. أي أنه عند تصميم برنامج بأسلوب OOP، فإنك تركز على النماذج العامة، دون الخوض في تفاصيل تنفيذها. في Java، يتم تحقيق التجريد من خلال الواجهات . على سبيل المثال، لديك سيارة وستكون بمثابة واجهة. والتفاعلات المختلفة معها - على سبيل المثال، تشغيل المحرك، وتبديل التروس - هي وظائف نستخدمها دون الخوض في تفاصيل التنفيذ. في الواقع، عندما تقود السيارة، فإنك لا تفكر بالضبط في كيفية قيام علبة التروس بتحقيق غرضها، أو كيف يقوم المفتاح بتشغيل المحرك، أو كيف تدير عجلة القيادة العجلات بالضبط. وإذا قمت باستبدال تنفيذ بعض الوظائف (على سبيل المثال، المحرك)، فقد لا تلاحظ ذلك. لا يهمك: لا تتعمق في تفاصيل التنفيذ. ما يهمك هو أن يتم تنفيذ الإجراء. في جوهر الأمر، هذا يلخص تفاصيل التنفيذ. عند هذه النقطة سنتوقف اليوم: يتبع!
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION