JavaRush /مدونة جافا /Random-AR /تحليل الأسئلة والأجوبة من المقابلات لمطور جافا. الجزء 1

تحليل الأسئلة والأجوبة من المقابلات لمطور جافا. الجزء 1

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

  2. يتم طرح الأسئلة باللغة الأوكرانية، ولكن نظرًا لأن غالبية المشاركين في JavaRush يتحدثون اللغة الروسية (وأنا أيضًا إلى حد كبير)، فإن الإجابات ستكون باللغة الروسية.

  3. ستكون الإجابات مختصرة، لأنه إذا كتبت بتفصيل كبير، فقد تتطلب الإجابات على بعض الأسئلة مقالة منفصلة. وأثناء المقابلات، ليست هناك حاجة إلى مثل هذه الإجابات التفصيلية والضخمة، لأن القائم بالمقابلة لديك لديه ساعة واحدة فقط لإجراء مقابلة معك حول المواضيع الضرورية (وكما تتذكر، هذا يكفي). بالنسبة لأولئك الذين يحبون التعمق أكثر، سأترك الروابط.

لذلك، دعونا نبدأ.

أسئلة وأجوبة مستوى المبتدئين

تحليل أسئلة وأجوبة المقابلة.  الجزء 1 - 2

قضايا عامة

1. ما هي أنماط التصميم التي تعرفها؟ أخبرنا عن القالبين اللذين استخدمتهما في عملك.

هناك مجموعة كبيرة ومتنوعة من القوالب: يمكنك البدء في التعرف عليها من هذه المقالة وهذه المقالة. حسنًا، بالنسبة لأولئك منكم الذين يريدون التعرف عليهم بالتفصيل، أوصي بقراءة كتاب "الرأس أولاً". أنماط التصميم " . بمساعدته، يمكنك دراسة أنماط التصميم الأساسية بالتفصيل وبطريقة سهلة. عندما يتعلق الأمر بأنماط التصميم التي يمكنك استخدامها كأمثلة في المقابلة، فإن بعض ما يتبادر إلى ذهنك هو:
  • يعد Builder قالبًا شائع الاستخدام، وهو بديل لإنشاء الكائنات الكلاسيكية؛
  • نمط الإستراتيجية ، الذي يمثل بطبيعته تعدد الأشكال. أي أن لدينا واجهة واحدة، لكن سلوك البرنامج سيتغير اعتمادًا على التنفيذ المحدد لهذه الواجهة الذي تم نقله إلى الوظيفة (الآن يتم استخدام الإستراتيجية عمليًا في كل مكان في تطبيقات Java).
إذا لم يكن هذا كافيًا بالنسبة لك، فاحرص على الانتباه إلى Spring (إذا كنت معتادًا عليه بالفعل)، لأنه عبارة عن منصة كاملة من الأطر، والتي بدورها مليئة بالأنماط لأعلى ولأسفل. فيما يلي بعض الأمثلة على ما أتحدث عنه:
  • المصنع - في ApplicationContext (أو في BeanFactory)؛
  • Singleton - جميع حبوب البن منفردة بشكل افتراضي؛
  • الوكيل - يستخدم كل شيء في Spring هذا النمط بطريقة أو بأخرى، على سبيل المثال، AOP؛
  • سلسلة المسؤولية هي نمط يعتمد على المفهوم الذي يعمل عليه Spring Security؛
  • القالب - يستخدم في Spring Jdbc.

جافا كور

تحليل أسئلة وأجوبة المقابلة.  الجزء 1 - 3

2. ما هي أنواع البيانات الموجودة في جافا؟

تحتوي Java على أنواع بيانات بدائية:
  • بايت — أعداد صحيحة في النطاق من -128 إلى 127، ويزن بايت واحد؛
  • قصيرة - أعداد صحيحة في النطاق -32768 إلى 32767، تزن 2 بايت؛
  • int - الأعداد الصحيحة -2147483648 إلى 2147483647، تزن 4 بايت؛
  • طويلة - الأعداد الصحيحة في النطاق 9223372036854775808 إلى 9223372036854775807، تزن 8 بايت؛
  • float - أرقام الفاصلة العائمة في النطاق -3.4E+38 إلى 3.4E+38، بوزن 4 بايت؛
  • مزدوج - أرقام الفاصلة العائمة في النطاق -1.7E+308 إلى 1.7E+308، تزن 8 بايت؛
  • char - أحرف مفردة في UTF-16، تزن 2 بايت؛
  • القيم المنطقية صحيح/خطأ ، ويزن 1 بايت.
وأنواع البيانات المرجعية ، التي تشير إلى الكائنات الموجودة في الكومة.

3. كيف يختلف الكائن عن أنواع البيانات البدائية؟

الفرق الأول: مقدار الذاكرة المشغولة: تشغل البدائيات القليل جدًا، لأنها تحتوي فقط على قيمتها الخاصة، بينما يمكن أن تحتوي الكائنات على قيم مختلفة جدًا جدًا: كل من البدائيات والمراجع إلى كائنات أخرى. الفرق الثاني: Java هي لغة موجهة للكائنات، لذلك كل شيء فيها يعمل من خلال التفاعل بين الكائنات، ولا تتلاءم البدائيات بشكل جيد (في الواقع، هذا هو السبب في أن Java ليست لغة موجهة للكائنات بنسبة 100٪). ثالثًا، متابعة للثاني: نظرًا لأن Java تركز على التفاعل بين الكائنات، فإن هذه الكائنات لديها العديد من الآليات المختلفة لإدارتها. على سبيل المثال، المنشئات والأساليب والاستثناءات (التي تعمل بشكل أساسي على الكائنات)، وما إلى ذلك. في الواقع، لكي يتمكن البدائيون بطريقة أو بأخرى من المشاركة (العمل) في هذه البيئة الموجهة للكائنات، تم اختراع أغلفة للأنواع البدائية ( Integer ، Character ، Double ، Boolean ...)

4. ما الفرق بين تمرير المعلمات حسب المرجع والقيمة؟

تقوم الحقول الأولية بتخزين قيمتها: على سبيل المثال، إذا قمنا بتعيين int i = 9; الحقل i يخزن القيمة 9 . عندما يكون لدينا مرجع لكائن ما، فهذا يعني أن لدينا حقل به مرجع للكائن، أو بمعنى آخر، بقيمة عنوان الكائن في الذاكرة.
Cat cat = new Cat();
اتضح أن الحقول التي تشير إلى كائن ما تقوم أيضًا بتخزين القيم وقيم عنوان الذاكرة. أي أن cat تقوم بتخزين قيمة عنوان كائن Cat() الجديد في الذاكرة. عندما نقوم بتمرير معلمة إلى طريقة ما، يتم نسخ قيمتها. في حالة البدائي، سيتم نسخ قيمة البدائي. وعليه فإن الطريقة ستعمل مع النسخة، وتغييرها لن يؤثر على الأصل. في حالة النوع المرجعي، سيتم نسخ قيمة عنوان الذاكرة، على التوالي، سيكون العنوان هو نفس الكائن الذي يشير إليه. وإذا قمنا بتغيير الكائن باستخدام هذا الارتباط الجديد، فسيتم تغييره للرابط القديم (بعد كل شيء، كلاهما يشير إلى نفس الكائن).

5. ما هو JVM، JDK، JRE؟

JVM - Java Virtual Machine هو جهاز افتراضي يقوم بتشغيل Java bytecode الذي تم إنشاؤه مسبقًا بواسطة المترجم. JRE - Java Runtime Environment - هي في الأساس بيئة لتشغيل تطبيقات Java، والتي تحتوي على JVM والمكتبات القياسية والمكونات الأخرى لتشغيل التطبيقات الصغيرة والتطبيقات المكتوبة بلغة برمجة Java. بمعنى آخر ، JRE عبارة عن حزمة من كل ما هو مطلوب لتشغيل برنامج Java مترجم، ولكنها لا تحتوي على أدوات وأدوات مساعدة مثل المترجمين أو مصححات الأخطاء لتطوير التطبيقات. JDK - Java Development Kit - مجموعة موسعة من JRE ، وهي بيئة ليس فقط للتشغيل، ولكن أيضًا لتطوير تطبيقات Java. يحتوي JDK على كل ما هو موجود في JRE، بالإضافة إلى العديد من الأدوات الإضافية - المترجمين ومصححي الأخطاء اللازمة لإنشاء تطبيقات في Java (يحتوي أيضًا على مستندات Java).تحليل أسئلة وأجوبة المقابلة.  الجزء 1 - 4

6. لماذا نستخدم JVM؟

كما ذكرنا أعلاه، Java Virtual Machine عبارة عن جهاز افتراضي يقوم بتشغيل Java bytecode الذي تم إنشاؤه مسبقًا بواسطة المترجم. أي أن JVM لا يفهم كود مصدر Java. لذلك، أولاً، يتم تجميع ملفات .java ، والتي بعد التجميع لها بالفعل امتداد .class والتي يتم تقديمها في شكل نفس رمز البايت الذي يفهمه JVM. يحتوي كل نظام تشغيل على JVM خاص به، لذلك بعد تلقي ملفات البايت كود، يقوم JVM بتنفيذها وتكييفها مع نظام التشغيل الذي يحدث عليه. في الواقع، نظرًا لاختلاف أنظمة تشغيل JVM، تختلف إصدارات JDK (أو JRE) باختلاف أنظمة تشغيل (يتطلب كل منها JVM خاصًا به). دعونا نتذكر كيف يعمل التطوير في لغات البرمجة الأخرى. تقوم بتطوير برنامج، ثم يتم تجميع الكود الخاص به في كود الجهاز لنظام تشغيل معين، ومن ثم يمكنك تشغيله. بمعنى آخر، أنت بحاجة إلى كتابة إصدارات مختلفة من البرنامج لكل نظام. بينما في Java، وبفضل معالجة التعليمات البرمجية المزدوجة (تجميع ومعالجة وحدات بايت كود JVM)، يمكنك الاستمتاع بمزايا الأنظمة الأساسية المشتركة. لقد أنشأنا الكود مرة واحدة، وأعدنا ترجمته إلى كود ثانوي، ونقلناه إلى أي نظام تشغيل، ويقوم JVM المحلي بتشغيل الكود. هذه هي الخاصية الأسطورية لجافا - الكتابة مرة واحدة، والتشغيل في أي مكان . تحليل أسئلة وأجوبة المقابلة.  الجزء 1 - 5اقرأ المزيد عن هذا في المقالة " تجميع وتنفيذ تطبيقات Java تحت الغطاء ".

7. ما هو الرمز الثانوي؟

كما قلت أعلاه، يقوم المترجم بتحويل كود Java إلى كود ثانوي متوسط ​​(الملفات ذات الامتداد .java إلى ملفات ذات الامتداد .class). يشبه Bytecode في كثير من النواحي رمز الجهاز، ولكنه يستخدم فقط مجموعة من التعليمات ليس من معالج حقيقي، ولكن من معالج افتراضي. علاوة على ذلك، قد يتضمن أقسامًا تركز على استخدام مترجم JIT، الذي يعمل على تحسين تنفيذ الأوامر للمعالج الحقيقي الذي يعمل عليه البرنامج. تجميع JIT، والذي يُطلق عليه أيضًا التجميع الفوري، هو تقنية تعمل على زيادة أداء البرنامج الذي يستخدم الكود الثانوي عن طريق تجميع الكود الثانوي في جهاز أو تنسيق آخر أثناء تشغيل البرنامج. كما كنت قد خمنت، يستخدم JVM مترجم JIT عندما يقوم بتشغيل الكود الثانوي. دعونا نلقي نظرة على مثال رمز بايت: تحليل أسئلة وأجوبة المقابلة.  الجزء 1 - 6ليس قابلاً للقراءة جدًا، أليس كذلك؟ حسنًا، هذه ليست تعليمات لنا، بل لـ JVM. إليك مقالة ستساعدك على فهم هذه المشكلة بشكل أفضل.

8. ما هي خصائص JavaBean؟

JavaBeans هي فئة Java لها قواعد معينة. فيما يلي بعض القواعد لكتابة JavaBean :
  1. يجب أن يحتوي الفصل على مُنشئ وصول عام فارغ (بدون معلمات) مع مُعدِّل الوصول العام . يتيح هذا المنشئ إمكانية إنشاء كائن من هذه الفئة دون مشاكل غير ضرورية (بحيث لا تكون هناك ضجة غير ضرورية مع المعلمات).

  2. يتم الوصول إلى الحقول الداخلية للفئة من خلال أساليب get and set ، والتي يجب أن تكون قياسية. على سبيل المثال، إذا كان الحقل هو الاسم ، ثم getName و setName، وما إلى ذلك. وهذا بدوره يسمح لأدوات (أطر العمل) المختلفة بتحديد محتويات الحبوب وتحديثها تلقائيًا دون تعقيدات.

  3. يجب أن يحتوي الفصل على إصدارات تم تجاوزها من التابعين hashCode () و toString()‎ يساوي() .

  4. يجب أن تكون الفئة قابلة للتسلسل، أي يجب أن تحتوي على واجهة علامة - قابلة للتسلسل أو تنفيذ واجهة قابلة للتحويل . يعد ذلك ضروريًا حتى يمكن حفظ حالة الحبة وتخزينها واستعادتها بشكل موثوق.

تحليل أسئلة وأجوبة المقابلة.  الجزء 1 - 7يمكنك أن تقرأ عن أنواع JavaBeans في هذه المادة .

9. ما هو OutOfMemoryError؟

يعد OutOfMemoryError أحد أخطاء وقت التشغيل الحرجة المرتبطة بتشغيل Java Virtual Machine (JVM). يتم استدعاؤه عندما يتعذر على JVM تخصيص كائن بسبب عدم توفر ذاكرة كافية له ولا يتمكن جامع البيانات المهملة من تخصيص المزيد من الذاكرة. بعض أنواع OutOfMemoryError :
  • OutOfMemoryError: مساحة كومة Java - لا يمكن تخصيص الكائن في كومة Java بسبب عدم كفاية الذاكرة. قد يكون سبب الخطأ تسرب للذاكرة أو لأن حجم الكومة الافتراضي ليس كبيرًا بما يكفي للتطبيق الحالي.

  • OutOfMemoryError: تم تجاوز حد الحمل الزائد لـ GC - نظرًا لحقيقة أن كمية البيانات بالكاد تتناسب مع الكومة، ويعمل جامع البيانات المهملة طوال الوقت، ويعمل برنامج Java ببطء شديد، ونتيجة لذلك، الحد الأقصى لمجمع البيانات المهملة تم تجاوزه ويتعطل التطبيق بسبب هذا الخطأ.

  • OutOfMemoryError: حجم الصفيف المطلوب يتجاوز حد VM - يشير إلى أن التطبيق حاول تخصيص ذاكرة لصفيف أكبر من حجم الكومة، والذي قد يكون مرة أخرى بسبب عدم كفاية تخصيص الذاكرة الافتراضية.

  • OutOfMemoryError: Metaspace - نفدت المساحة المخصصة للبيانات التعريفية في الكومة (بيانات التعريف هي تعليمات للفئات والأساليب).

  • OutOfMemoryError: طلب بايتات الحجم لسبب ما. نفاد مساحة المبادلة - حدث بعض الفشل عند محاولة تخصيص الذاكرة من الكومة، ونتيجة لذلك، كان هناك نقص في الذاكرة في الكومة.

10. ما هو تتبع المكدس؟ كيف يمكن الحصول عليها؟

يعد Stack Trace قائمة بالفئات والأساليب التي تم استدعاؤها حتى هذه اللحظة في التطبيق. يمكنك استدعاء تتبع المكدس عند نقطة معينة في التطبيق مثل هذا:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
بهذه الطريقة سوف نحصل على مجموعة من عناصر تتبع المكدس مرتبة بترتيب LIFO - آخر ما يدخل أولاً يخرج . تحليل أسئلة وأجوبة المقابلة.  الجزء 1 - 8في Java، كقاعدة عامة، عندما يتحدثون عن تتبع المكدس، فإنهم يقصدون تتبع المكدس الذي يتم عرضه في وحدة التحكم عند حدوث خطأ (أو استثناء). يمكنك الحصول على تتبع المكدس للاستثناءات مثل هذا:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
حسنًا، إذا كنا نتحدث عن إخراج تتبع مكدس الاستثناءات في وحدة التحكم:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
أيضًا، إذا كان لدينا خطأ، أو استثناء لم يتم التحقق منه أو استثناء محدد ، والذي لن نقوم بمعالجته، ولكننا سنعيد توجيهه فقط، فعندما يتعطل التطبيق، سنتلقى تلقائيًا تتبع مكدس الاستثناءات في وحدة التحكم. مثال صغير على استثناءات تتبع المكدس في وحدة التحكم: تحليل أسئلة وأجوبة المقابلة.  الجزء 1 - 9يمكنك قراءة المزيد حول Stack Trace هنا . سنركز على هذا الموضوع اليوم..تحليل أسئلة وأجوبة المقابلة.  الجزء 1 - 10
مواد أخرى في السلسلة:
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION