أسئلة وأجوبة مقابلة Java SE 8 (الجزء الثاني)

في مشاركتي السابقة، قمت بمناقشة بعض أهم أسئلة وأجوبة مقابلات Java SE 8. في هذه المشاركة، سنناقش بعض أسئلة وأجوبة المقابلات الأخرى لـ Java SE 8. قبل قراءة هذه المشاركة، يرجى مراجعة المشاركة السابقة على الرابط: “أسئلة مقابلات Java SE 8 (الجزء الأول)“.

أسئلة مقابلات Java SE 8

  1. ما هو التكرار الداخلي في Java SE 8؟
  2. ما هي الاختلافات بين التكرار الخارجي والتكرار الداخلي؟
  3. ما هي العيوب الرئيسية للتكرار الخارجي؟
  4. ما هي المزايا الرئيسية للتكرار الداخلي على التكرار الخارجي؟
  5. ما هي العيب الرئيسي للتكرار الداخلي على التكرار الخارجي؟
  6. ما هي الميزة الرئيسية للتكرار الخارجي على التكرار الداخلي؟
  7. متى نحتاج إلى استخدام التكرار الداخلي؟ متى نحتاج إلى استخدام التكرار الخارجي؟
  8. ما هي الاختلافات بين العمليات الوسيطة والعمليات النهائية في واجهة Stream API في Java 8؟
  9. هل من الممكن توفير تنفيذات الأساليب في واجهات Java؟ إذا كان ذلك ممكنًا، كيف يمكننا توفيرها؟
  10. ما هو الطريقة الافتراضية؟ لماذا نحتاج إلى طرق افتراضية في واجهات Java 8؟
  11. ما هو الطريقة الثابتة؟ لماذا نحتاج إلى طرق ثابتة في واجهات Java 8؟
  12. الفروق بين البرمجة الوظيفية والبرمجة الموجهة للكائنات؟
  13. شرح مشاكل واجهة برمجة التواريخ القديمة في جافا؟ ما هي مزايا واجهة تواريخ ووقت جافا 8 على واجهة التواريخ القديمة وواجهة Joda Time؟
  14. لماذا نحتاج إلى واجهة تواريخ ووقت جديدة في جافا SE 8؟ شرح كيف تحل واجهة تواريخ ووقت جافا SE 8 مشاكل واجهة التواريخ القديمة في جافا؟
  15. ما هي الفروق بين واجهة تواريخ الجافا القديمة وواجهة تواريخ جافا 8؟
  16. ما هي التوريث المتعدد؟ كيف يدعم جافا 8 التوريث المتعدد؟
  17. ما هي مشكلة الماس في الواجهات بسبب الطرق الافتراضية؟ كيف تحل جافا 8 هذه المشكلة؟

أسئلة وأجوبة حول جافا SE 8

ما هي الإيتيريشن الداخلية في جافا SE 8؟

قبل جافا 8، لم يكن لدينا مفهوم التكرار الداخلي. قدمت جافا 8 ميزة جديدة تُعرف بـ “التكرار الداخلي”. قبل جافا 8، كان للغة جافا التكرار الخارجي فقط لتكرار عناصر كائن مجمع مثل المجموعات والمصفوفات وما إلى ذلك. التكرار الداخلي يعني “تكرار عناصر كائن مجمع واحد تلو الآخر داخليًا باستخدام واجهة برمجة تطبيقات جافا”. بدلاً من أن يقوم تطبيق جافا بالتكرار خارجيًا، نطلب من واجهة برمجة تطبيقات جافا القيام بتلك الوظيفة داخليًا.

ما هي الاختلافات بين التكرار الخارجي والتكرار الداخلي؟

S.No. External Iteration Internal Iteration
1. Available before Java 8 too. It is introduced in Java SE 8
2. Iterating an Aggregated Object elements externally. Iterating an Aggregated Object elements internally (background).
3. Iterate elements by using for-each loop and Iterators like Enumeration, Iterator, ListIterator. Iterate elements by using Java API like “forEach” method.
4. Iterating elements in Sequential and In-Order only. Not required to iterate elements in Sequential order.
5. It follows OOP approach that is Imperative Style. It follows Functional Programming approach that is Declarative Style.
6. It does NOT separate responsibilities properly that is, it defines both “What is to be done” and “How it is to be done”. It defines only “What is to be done”. No need to worry about “How it is to be done”. Java API takes care about “How to do”.
7. Less Readable Code. More Readable code.

ما هي المشاكل الرئيسية للتكرار الخارجي؟

يتضمن التكرار الخارجي المشاكل التالية:

  • يجب علينا كتابة الشفرة بنمط البرمجة الإمبراطورية.
  • لا يوجد تفصيل واضح للمسؤوليات. ارتباط ضيق بين شفرة “ما يجب فعله” وشفرة “كيف يجب فعله”.
  • الشفرة أقل قراءة.
  • الشفرة أكثر تكرارًا ومللًا.
  • يجب علينا تكرار العناصر بترتيب تسلسلي فقط.
  • لا يدعم الاستدامة والتوازن الجيد للعمل المتزامن.

ما هي المزايا الرئيسية للتكرار الداخلي على التكرار الخارجي؟

يتمتع التكرار الداخلي بالمزايا التالية مقارنة بالتكرار الخارجي:

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

ما هي العيب الرئيسي للتكرار الداخلي على التكرار الخارجي؟

يوجد للتكرار الداخلي عيب رئيسي واحد مقارنة بالتكرار الخارجي:

  • في التكرار الداخلي ، حيث يهتم واجهة برمجة التطبيقات في جافا بتكرار العناصر داخليًا ، فإننا ليس لدينا سيطرة على التكرار.

ما هو الميزة الرئيسية للتكرار الخارجي على التكرار الداخلي؟

بالمقارنة مع التكرار الداخلي ، يتمتع التكرار الخارجي بميزة رئيسية واحدة:

  • في التكرار الخارجي ، حيث لا تهتم واجهة برمجة التطبيقات في جافا بتكرار العناصر ، فإن لدينا مزيدًا من السيطرة على التكرار.

متى يجب علينا استخدام التكرار الداخلي؟ متى يجب علينا استخدام التكرار الخارجي؟

يجب علينا أن نفهم الحالات التي نحتاج فيها إما إلى التكرار الداخلي أو التكرار الخارجي.

  • عندما نحتاج إلى مزيد من السيطرة على التكرار ، يمكننا استخدام التكرار الخارجي.
  • عندما لا نحتاج إلى مزيد من السيطرة على التكرار ، يمكننا استخدام التكرار الداخلي.
  • عندما نحتاج إلى تطوير تطبيقات عالية التوازن والتوازي ونحن ، يجب علينا استخدام التكرار الداخلي.

الاختلافات بين العمليات الوسيطة والعمليات النهائية لواجهة برمجة تطبيقات ستريم في جافا 8؟

S.No. Stream Intermediate Operations Stream Terminal Operations
1. Stream Intermediate operations are not evaluated until we chain it with Stream Terminal Operation. Stream Terminal Operations are evaluated on it’s own. No need other operations help.
2. The output of Intermediate Operations is another Stream. The output of Intermediate Operations is Not a Stream. Something else other than a Stream.
3. Intermediate Operations are evaluated Lazily. Terminal Operations are evaluated Eagerly.
4. We can chain any number of Stream Intermediate Operations. We can NOT chain Stream Terminal Operations.
5. We can use any number of Stream Intermediate Operations per Statement. We can use only one Stream Terminal Operation per Statement.

هل يمكن توفير تنفيذات الطرق في واجهات جافا؟ إذا كان ذلك ممكنًا ، فكيف نقدمها؟

في جافا 7 أو الإصدارات السابقة ، لا يمكن توفير تنفيذات الطرق في الواجهات. اعتبارًا من جافا 8 وما بعدها ، أصبح ذلك ممكنًا. في جافا SE 8 ، يمكننا توفير تنفيذات الطرق في الواجهات باستخدام المفاهيم الجديدتين التاليتين:

  • الطرق الافتراضية
  • الطرق الثابتة

ما هي الطريقة الافتراضية؟ لماذا نحتاج إلى الطرق الافتراضية في واجهات جافا 8؟

A Default Method is a method which is implemented in an interface with “default” keyword. It’s new featured introduced in Java SE 8. We need Default Methods because of the following reasons:

  • يتيح لنا طريقة تنفيذ الواجهات.
  • لإضافة وظائف جديدة إلى الواجهة دون كسر الصنف الذي ينفذ تلك الواجهة.
  • لتوفير ميزة التوافق العكسي الأنيقة.
  • لتسهيل تمديد الوظائف الحالية.
  • لتسهيل صيانة الوظائف الحالية.

ما هو الأسلوب الثابت؟ لماذا نحتاج إلى أساليب ثابتة في واجهات جافا 8؟

A Static Method is an Utility method or Helper method, which is associated to a class (or interface). It is not associated to any object. We need Static Methods because of the following reasons:

  • يمكننا الاحتفاظ بالطرق المساعدة أو الأدوات المحددة لواجهة في نفس الواجهة بدلاً من وضعها في فئة أدوات منفصلة.
  • لا نحتاج إلى فئات أدوات منفصلة مثل Collections و Arrays وما إلى ذلك للاحتفاظ بالأدوات المساعدة.
  • فصل واضح للمسؤوليات. وهذا يعني أننا لا نحتاج إلى فئة أدوات واحدة للاحتفاظ بجميع الأدوات المساعدة في واجهة Collection API مثل Collections وما إلى ذلك.
  • سهولة توسيع واجهة التطبيق.
  • سهولة صيانة واجهة التطبيق.

الاختلافات بين البرمجة الوظيفية والبرمجة الموجهة للكائنات؟

Functional Programming OOP
Does not exist State Exists State
Uses Immutable data Uses Mutable data
It follows Declarative Programming Model It follows Imperative Programming Model
Stateless Programming Model Stateful Programming Model
Main Fcous on: “What you are doing” Main focus on “How you are doing”
Good for Parallel (Concurrency) Programming Poor for Parallel (Concurrency) Programming
Good for BigData processing and analysis NOT Good for BigData processing and analysis
Supports pure Encapsulation It breaks Encapsulation concept
Functions with No-Side Effects Methods with Side Effects
Functions are first-class citizens Objects are first-class citizens
Primary Manipulation Unit is “Function” Primary Manipulation Unit is Objects(Instances of Classes)
Flow Controls: Function calls, Function Calls with Recursion Flow Controls: Loops, Conditional Statements
It uses “Recursion” concept to iterate Collection Data. It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java
Order of execution is less importance. Order of execution is must and very important.
Supports both “Abstraction over Data” and “Abstraction over Behavior”. Supports only “Abstraction over Data”.
We use FP when we have few Things with more operations. We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java.

ملاحظة: – لمزيد من المعلومات حول مقارنة FP و IP و OOP ، يرجى الاطلاع على مشاركتي السابقة على: “مقارنة FP ، OOP (IP)

شرح مشكلات واجهة برمجة تطبيقات Java القديمة؟ ما هي مزايا واجهة برمجة التطبيقات الجديدة لـ Java 8 على واجهة برمجة التطبيقات القديمة وواجهة برمجة التطبيقات Joda؟

واجهة برمجة التطبيقات القديمة لـ Java تعني واجهة برمجة التطبيقات المتاحة قبل Java SE 8 ، أي Date ، Calendar ، SimpleDateFormat ، إلخ. واجهة برمجة التطبيقات القديمة لـ Java لديها المشاكل أو العيوب التالية مقارنة بواجهة برمجة التطبيقات الجديدة لـ Java 8 وواجهة برمجة التطبيقات Joda.

  • معظم واجهة برمجة التطبيقات متوقفة.
  • قراءة أقل.
  • java.util.Date قابل للتغيير وغير آمن في الموضوع.
  • java.text.SimpleDateFormat غير آمن في الموضوع.
  • أداء أقل.

واجهة برمجة التطبيقات الجديدة لـ Java SE 8 لديها المزايا التالية مقارنة بواجهة برمجة التطبيقات القديمة لـ Java.

  • سهلة جدا في الاستخدام.
  • صيغة قابلة للقراءة من البشر أي أكثر قابلية للقراءة.
  • جميع واجهة برمجة التطبيقات آمنة في الموضوع.
  • أداء أفضل.

لماذا نحتاج إلى واجهة برمجة تطبيقات تاريخ ووقت جديدة في جافا SE 8؟ شرح كيف تحل واجهة برمجة تطبيقات تاريخ ووقت جافا SE 8 مشكلات واجهة برمجة تاريخ جافا القديمة؟

نحتاج إلى واجهة برمجة تطبيقات تاريخ ووقت جافا SE 8 لتطوير تطبيقات جافا عالية الأداء وآمنة للموضوع وذات قابلية توسع عالية. تحل واجهة برمجة تطبيقات تاريخ ووقت جافا SE 8 جميع مشكلات واجهة برمجة تاريخ جافا القديمة من خلال متابعة مبادئ الثبات والأمان للموضوع.

ما هي الاختلافات بين واجهة برمجة تطبيقات تاريخ جافا القديمة وواجهة برمجة تطبيقات تاريخ ووقت جافا SE 8؟

الاختلافات بين واجهة برمجة تطبيقات تاريخ جافا القديمة وواجهة برمجة تطبيقات تاريخ ووقت جافا SE 8:

S.No. Java’s OLD Java Date API Java 8’s Date and Time API
1. Available before Java 8 too. It is introduced in Java SE 8
2. Not Thread Safe. Thread Safe.
3. Mutable API. Immutable API.
4. Less Performance. Better Performance.
5. Less Readability. More Readability.
6. It’s not recommended to use as its deprecated. It’s always recommended to use.
7. Not Extendable. Easy to Extend.
8. It defines months values from 0 to 11, that is January = 0. It defines months values from 1 to 12, that is January = 1.
9. It’s an old API. It’s a new API.

ما هي التوريث المتعدد؟ كيف يدعم جافا 8 التوريث المتعدد؟

التوريث المتعدد يعني أن الصف يمكنه أن يرث أو يوسع الخصائص والميزات من أكثر من صف أب. في جافا 7 أو الإصدارات السابقة، لا يكون التوريث المتعدد ممكنًا لأن جافا تتبع قاعدة “يجب أن يمتد الصف من صف واحد فقط أو صف مجرد”. ومع ذلك، يكون من الممكن توفير التوريث المتعدد للتنفيذ باستخدام الواجهة لأن جافا تتبع قاعدة “يمكن للصف أن يمتد أي عدد من الواجهات”. ومع ذلك، يدعم جافا 8 “تنفيذ الأساليب في الواجهات” من خلال إدخال ميزات جديدة: الأساليب الافتراضية في الواجهة. بسبب هذه الميزة، يدعم جافا 8 التوريث المتعدد مع بعض القيود.

ما هي مشكلة الالماس في الواجهات بسبب الأساليب الافتراضية؟ كيف يحل جافا 8 هذه المشكلة؟

تسبب طرق Java 8 الافتراضية المشكلة المعروفة باسم “مشكلة الماسة” عندما تنفذ الصف عدة واجهات. يحدث ذلك عندما يمتد الصف من أكثر من واجهة ويكون لديها تنفيذات طرق متشابهة (طرق افتراضية). كود عينة في Java SE 8 لعرض مشكلة الماسة باستخدام طرق الواجهة الافتراضية.

interface A {
	default void display() {
		System.out.println("A");
	}
}

interface B extends A {
	default void display() {
		System.out.println("B");
	}
}

interface C extends A {
	default void display() {
		System.out.println("C");
	}
}

class D implements B, C {
}

في مقتطف الكود أعلاه، تعطي الصف D خطأ في وقت الترجمة “توجد طرق افتراضية مكررة بنفس الاسم display مع المعاملات () و () تمرَّث من أنواع C و B”. يحدث ذلك لأن مترجم جافا سيحتار حول أي display() يجب استخدامه في الصف D. الصف D يرث طريقة display() من كلا الواجهتين B و C. لحل هذه المشكلة، قدم Java 8 الحل التالي.

class D implements B, C {

	@Override
	public void display() {
		B.super.display();
	}
	
}

سيحل هذا B.super.display(); المشكلة الماسة. إذا كنت ترغب في استخدام طريقة الواجهة C الافتراضية، استخدم C.super.display();. هذا كل شيء عن أسئلة مقابلة Java 8. سنناقش بعض أسئلة المقابلة الأخرى في Java SE 8 في مشاركاتي القادمة. يرجى ترك تعليق إذا أعجبك المنشور أو كان لديك أي مشاكل / اقتراحات.

Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part2