مقدمة: لماذا لا تغفر Java التهاون
\n\nلقد أرسلت سيرتك الذاتية، واجتزت فحص الموارد البشرية، وها هي الدعوة لمقابلة فنية. إذا كنت تقرأ هذه المقالة على pythonlib.ru، فإما أنك تنتقل من Python إلى Java، أو ببساطة تجمع "قاعدة معرفية". في كلتا الحالتين - أنت على الطريق الصحيح.
\n\nJava ليست لغة يمكنك "المرور فيها" بالكاريزما. يتطلب النظام البيئي للمؤسسات فهماً واضحاً: من JMM (نموذج ذاكرة Java) إلى كيفية عمل جامع القمامة (Garbage Collector). مقابلة Java ليست امتحاناً، بل حوار. لكنه حوار سيتم اختبار قوتك فيه.
\n\nفي هذه المقالة، جمعت قائمة تحقق حقيقية: ما الذي تدرسه، وكيف تجيب، والأهم من ذلك - كيف لا تخفق في البرمجة المباشرة. بدون حشو، فقط ممارسة.
\n\n1. أساسيات Java: الأساس الذي يجب حفظه عن ظهر قلب
\n\nلنبدأ من الأساسيات. بدون أساسيات Java لن يستمعوا إليك ببساطة. إليك قائمة المواضيع التي يجب على كل مرشح معرفتها:
\n\n1.1. البرمجة كائنية التوجه (OOP)
\nيجب أن تكون قادراً على شرح تعدد الأشكال، الوراثة، التغليف والتجريد بأمثلة بسيطة. مع أمثلة.
\n\nسؤال فخ: "ما الفرق بين الفئة المجردة والواجهة؟"
\nالإجابة الصحيحة: في Java 8+ ظهرت الطرق الافتراضية في الواجهات، لكن الفئة المجردة يمكنها احتواء حالة (حقول)، بينما الواجهة لا تستطيع.
\n\n// مثال: فئة مجردة\nabstract class Animal {\n protected String name;\n abstract void makeSound();\n}\n\n// واجهة بطريقة افتراضية\ninterface Movable {\n default void move() {\n System.out.println("Moving...");\n }\n}\n\n1.2. المجموعات (إطار عمل مجموعات Java)
\nهذا أمر لا بد منه. معرفة HashMap, ArrayList, HashSet, TreeMap لا تكفي. يجب فهم:
\n- \n
- كيف يعمل HashMap (مصفوفة + قائمة مرتبطة + شجرة حمراء-سوداء منذ Java 8) \n
- الفرق بين المكررات سريعة الفشل وآمنة الفشل \n
- متى تستخدم LinkedList بدلاً من ArrayList (تنبيه: تقريباً أبداً) \n
نصيحة: في المقابلة، قد يُطلب منك كتابة تطبيقك الخاص لـ HashMap. تدرب مسبقاً.
\n\n1.3. الاستثناءات (Exceptions)
\nالمتحقق منه مقابل غير المتحقق منه - كلاسيكي. تذكر: RuntimeException وورثته غير متحقق منه، وكل ما عداه متحقق منه. وأبداً، اسمع، أبداً لا تستخدم catch (Exception e) {} - هذا نمط سيء.
2. تعدد المهام: الموضوع الذي يفشل فيه 80% من المرشحين
\n\nJava هي واحدة من اللغات القليلة التي يكون فيها تعدد المهام مدمجاً على مستوى اللغة. في المقابلة، سيُسألونك بالتأكيد عن synchronized, volatile, AtomicInteger, Lock, Semaphore.
\n\n2.1. الكلمة المفتاحية volatile
\nالسؤال الرئيسي: "هل تضمن volatile الذرية؟" الإجابة: لا. إنها تضمن فقط رؤية التغييرات بين الخيوط.
\n\npublic class VolatileExample {\n private volatile boolean flag = true;\n\n public void stop() {\n flag = false; // الخيط الآخر سيرى هذا التغيير فوراً\n }\n}\n\n2.2. الجمود (Deadlock) وكيفية تجنبه
\nقد يُطلب منك كتابة كود يؤدي إلى الجمود، ثم إصلاحه.
\n\n// جمود كلاسيكي\npublic class DeadlockExample {\n private final Object lock1 = new Object();\n private final Object lock2 = new Object();\n\n public void method1() {\n synchronized (lock1) {\n synchronized (lock2) { /* ... */ }\n }\n }\n\n public void method2() {\n synchronized (lock2) {\n synchronized (lock1) { /* ... */ }\n }\n }\n}\n\nالحل: دائماً احصل على الأقفال بنفس الترتيب، أو استخدم tryLock() من حزمة java.util.concurrent.locks.