בפוסט זה, אנחנו הולכים לדון בכמה שאלות חשובות בראיון Java SE 8 עם תשובות. אכתוב פוסט נוסף כדי לדון בשאלות הנותרות בראיון
Java 8
- למה אנחנו צריכים שינוי שוב ל-Java?
- תכונות חדשות ב-Java SE 8?
- יתרונות של תכונות חדשות ב-Java SE 8?
- מהו ביטוי למבדר?
- מהם שלושת חלקי הביטוי למבדר? מהו סוג הביטוי למבדר?
- מהו ממשק פונקציונלי? מהו ממשק SAM?
- האם אפשר להגדיר ממשק פונקציונלי משלנו? מהו @FunctionalInterface? מהן הכללים להגדרת ממשק פונקציונלי?
- האם סימון @FunctionalInterface הוא חובה כדי להגדיר ממשק פונקציונלי? מהו השימוש בסימון @FunctionalInterface? למה אנו זקוקים לממשקי פונקציות ב-Java?
- מתי אנחנו משתמשים ב-Stream API של Java 8? למה אנחנו צריכים להשתמש ב-Stream API של Java 8 בפרוייקטים שלנו?
- הסבר על השוני בין API של Collection לבין API של Stream?
- מהו Spliterator ב-Java SE 8? ההבדלים בין Iterator ו-Spliterator ב-Java SE 8?
- מהו Optional ב-Java 8? מה השימוש של Optional? יתרונות של Optional ב-Java 8?
- מהו הכרת סוג? האם הכרת סוג זמינה בגרסאות ישנות יותר כמו Java 7 ולפני 7 או היא זמינה רק ב-Java SE 8?
שאלות ותשובות ראיון ב-Java 8
בסעיף זה, נבחר בכל שאלה מהסעיף הקודם ונענה עליה בתיאור מפורט. אם נדרשת מידע נוסף או דוגמאות, אנא עיין בפוסטים הקודמים של Java SE 8 הזמינים ב-JournalDEV.
למה זקוקים שוב לשינוי ב-Java?
התאגדות אוראקל הכניסה ל-Java SE 8 מספר מושגים חדשים כדי להביא את היתרונות הבאים:
- לנצל ביעילות מעבדי מרובי ליבות נוכחיים
לאחרונה, ניתן לראות שינויים דרסטיים בחומרה. בימינו, כל המערכות משתמשות במעבדי מרובי ליבות (2, 4, 8, 16 ליבות, וכו') כדי לפרוס ולהפעיל את היישומים שלהן. אנו זקוקים למבנים תכנותיים חדשים ב-Java כדי לנצל ביעילות את מעבדי המרובי ליבות הללו כדי לפתח יישומים בעלי התנהגות מרובת ליבות וקידמה גבוהה.לנצל את תכונות ה- FP
חברת Oracle הכניסה הרבה מושגים של FP (תכנות פונקציונלי) כחלק מ-Java SE 8 כדי לנצל את היתרונות של FP.
תכונות חדשות ב-Java SE 8?
- ביטויי למבדרים
- ממשקי פונקציות
- ממשק Stream
- ממשק זמן ותאריך
- שיטות ברירת מחדל ושיטות סטטיות בממשקים
- Spliterator
- הפניות לשיטות ולבנאים
- שיפורים ב-API של מבני נתונים
- שיפורים בכלי ה-Concurrency Utils
- שיפורים ב-Fork/Join Framework
- איטרציה פנימית
- פעולות מערך ואוספים פרוליים
- Optional
- הערות סוג והערות חוזרות
- שקפית העברת פרמטרים לשיטות
- הצפנת ופענוח Base64
- שדרוגים ב-IO ו-NIO2
- מנוע JavaScript של Nashorn
- שדרוגים ב-javac
- שינויים ב-JVM
- פרופילים קומפקטיים ב-Java 8: compact1, compact2, compact3
- JDBC 4.2
- JAXP 1.6
- Java DB 10.10
- רשתות
- שינויים באבטחה
יתרונות של תכונות חדשות ב-Java SE 8?
אנו יכולים ליהנות מהיעדים הבאים מתכונות חדשות ב-Java SE 8:
- קוד יותר קצר ונקרא
- קוד ניתן להשתמש בו יותר מחדש
- קוד ניתן לבדוק ולתחזק בצורה יותר טובה
- קוד בעל ביצוע גבוה ונמתח
- כתיבת קוד מקביל
- כתיבת פעולות דומות לבסיסי נתונים
- יישומים עם ביצוע משופר
- קוד יותר יעיל
מהו ביטוי Lambda?
\begin{hebrew}
ביטוי למבדה הוא פונקציה אנונימית המקבלת סט של פרמטרים קלט ומחזירה תוצאות. ביטוי למבדה הוא קטע קוד ללא שם, עם או בלעדי פרמטרים ועם או בלעדי תוצאות. קטע קוד זה מבוצע לפי דרישה.
מהם שלושת חלקיו של ביטוי למבדה? מהו סוגו של ביטוי למבדה?
A Lambda Expression contains 3 parts:
- רשימת פרמטרים
ביטוי למבדה יכול לכלול אפס או יותר פרמטרים. זה אופציונלי. – אופרטור חץ למבדה
"->" ידוע כאופרטור חץ למבדה. זה מפריד בין רשימת הפרמטרים והגוף. – גוף למבדה
הסוג של "Journal Dev" הוא java.lang.String. הסוג של "true" הוא Boolean. באותו אופן, מהו הסוג של ביטוי למבדה? הסוג של ביטוי למבדה הוא ממשק פונקציונאל. דוגמה: – מהו הסוג של ביטוי למבדה הבא?
() -> System.out.println("Hello World");
ביטוי למבדה זה אינו מכיל פרמטרים ולא מחזיר תוצאות. לכן הסוג שלו הוא "java.lang.Runnable" ממשק פונקציונאל.
\end{hebrew}
מהו ממשק פונקציונלי? מהו ממשק SAM?
A Functional Interface is an interface, which contains one and only one abstract method. Functional Interface is also known as SAM Interface because it contains only one abstract method. SAM Interface stands for Single Abstract Method Interface. Java SE 8 API has defined many Functional Interfaces.
האם ניתן להגדיר ממשק פונקציונלי משלנו? מהו@FunctionalInterface? מהן החוקים להגדרת ממשק פונקציונלי?
כן, ניתן להגדיר ממשקים פונקציונליים משלנו. אנו משתמשים באנוטציה @FunctionalInterface של Java SE 8 כדי לסמן אינטרפייס כממשק פונקציונלי. עלינו לעקוב אחרי כללים אלו כדי להגדיר ממשק פונקציונלי:
- להגדיר אינטרפייס עם שיטה אבסטרקטית רק אחת ובלבד.
- אין לנו אפשרות להגדיר יותר משיטה אבסטרקטית אחת.
- להשתמש באנוטציה @FunctionalInterface בהגדרת האינטרפייס.
- אנו יכולים להגדיר כל מספר של שיטות אחרות כמו שיטות ברירת מחדל, שיטות סטטיות.
- אם אנו מתעלמים מהשיטה של מחלקת java.lang.Object ומגדירים אותה כשיטה מופשטת, אז זה אינו נחשב לשיטה מופשטת.
האם @FunctionalInterface הוא הכרחי להגדיר ממשק פונקציונלי? מהו השימוש בהכרזה @FunctionalInterface? למה נצטרך בממשקי פונקציות ב-Java?
אין חובה להגדיר ממשק פונקציונלי עם ההכרזה @FunctionalInterface. אם לא רוצים, ניתן להתעלם מההכרזה. אך אם נשתמש בה בהגדרת ממשק פונקציונלי, מהדר ה-Java יכריח להשתמש בדיוק בשיטה אחת ולבד בממשק זה. למה נצטרך בממשקים פונקציונליים? סוג הביטוי Lambda של Java SE 8 הוא ממשק פונקציונלי. בכל מקום שאנו משתמשים בביטויי Lambda, זה אומר שאנו משתמשים בממשקים פונקציונליים.
מתי אנחנו הולכים לשימוש ב-Java 8 Stream API? למה אנחנו צריכים להשתמש ב-Java 8 Stream API בפרויקטים שלנו?
כאשר פרויקט ה-Java שלנו רוצה לבצע את הפעולות הבאות, כדאי להשתמש ב-Java 8 Stream API כדי לקבל הרבה יתרונות:
- כאשר רוצים לבצע פעולות דומות למסד נתונים. לדוגמה, רוצים לבצע פעולת groupby, פעולת orderby וכו'
- כאשר רוצים לבצע פעולות באופן עצלן.
- כאשר רוצים לכתוב תכנות בסגנון פונקציונלי.
- כאשר רוצים לבצע פעולות מקביליות.
- כאשר רוצים להשתמש באיטרציה פנימית
- כאשר רוצים לבצע פעולות פייפליינינג.
- כאשר רוצים להשיג ביצועים טובים יותר.
להסביר את ההבדלים בין Collection API ל-Stream API?
S.No. | Collection API | Stream API |
---|---|---|
1. | It’s available since Java 1.2 | It is introduced in Java SE 8 |
2. | It is used to store Data (A set of Objects). | It is used to compute data (Computation on a set of Objects). |
3. | We can use both Spliterator and Iterator to iterate elements. We can use forEach to performs an action for each element of this stream. | We can’t use Spliterator or Iterator to iterate elements. |
4. | It is used to store unlimited number of elements. | Stream API is used to process on the elements of a Collection. |
5. | Typically, it uses External Iteration concept to iterate Elements such as Iterator. | Stream API uses internal iteration to iterate Elements, using forEach methods. |
6. | Collection Object is constructed Eagerly. | Stream Object is constructed Lazily. |
7. | We add elements to Collection object only after it is computed completely. | We can add elements to Stream Object without any prior computation. That means Stream objects are computed on-demand. |
8. | We can iterate and consume elements from a Collection Object at any number of times. | We can iterate and consume elements from a Stream Object only once. |
מהו Spliterator ב-Java SE 8? ההבדלים בין Iterator ו-Spliterator ב-Java SE 8?
Spliterator מייצג את Splitable Iterator. הוא הוכנס באופן חדש על ידי חברת אורקל כחלק מ-Java SE 8. דומה ל-Iterator ול-ListIterator, זהו גם אחד מממשקי ה-Iterator.
S.No. | Spliterator | Iterator |
---|---|---|
1. | It is introduced in Java SE 8. | It is available since Java 1.2. |
2. | Splitable Iterator | Non-Splitable Iterator |
3. | It is used in Stream API. | It is used for Collection API. |
4. | It uses Internal Iteration concept to iterate Streams. | It uses External Iteration concept to iterate Collections. |
5. | We can use Spliterator to iterate Streams in Parallel and Sequential order. | We can use Iterator to iterate Collections only in Sequential order. |
6. | We can get Spliterator by calling spliterator() method on Stream Object. | We can get Iterator by calling iterator() method on Collection Object. |
7. | Important Method: tryAdvance() | Important Methods: next(), hasNext() |
מהו Optional ב-Java 8? מהו השימוש ב-Optional? יתרונות של Optional ב-Java 8?
Optional: Optional הוא מחלקה סופית שהוכנסה כחלק מ-Java SE 8. היא מוגדרת בחבילת java.util. היא משמשת לייצוג של ערכים אופציונליים שיכולים להיות קיימים או שאינם קיימים. היא יכולה להכיל ערך אחד או אפס ערך. אם היא מכילה ערך, אפשר לקבל אותו. אחרת, לא מקבלים דבר. זו אוסף מוגבל, במובן שהיא מכילה לכל היותר רק איבר אחד. זו אלטרנטיבה לערך "null". היתרון העיקרי של Optional הוא:
- השימוש בו מאפשר להימנע מבדיקות null.
- השימוש בו מאפשר להימנע מ-"NullPointerException".
מהו הסקירה של הסוג (Type Inference)? האם הסקירה זמינה בגרסאות ישנות כמו Java 7 ולפני 7, או היא זמינה רק ב-Java SE 8?
הסקירה של הסוג מתייחסת לקביעת הסוג על ידי המהדר בזמן קומפילציה. זו לא תכונה חדשה ב-Java SE 8. היא זמינה גם ב-Java 7 ולפני כן. לפני Java 7:- בואו נכנס לעולם של מערכות מערכת Java. הגדירו מחרוזת מסוג String עם ערכים כפי שמוצג למטה:
String str[] = { "Java 7", "Java 8", "Java 9" };
כאן יש טיפול בערכים מסוג String בצד ימין, אך לא הוגדר סוגם. המהדר של Java משתמש בהבנה אוטומטית ויוצר מערך מסוג String. Java 7: חברת Oracle הציעה "אופרטור היהלום" (Diamond Operator) כתכונה חדשה ב-Java SE 7 כדי למנוע הגדרה מיותרת של סוגים בגנריקה.
Map<String,List<Customer>> customerInfoByCity = new HashMap<>();
כאן לא הוגדרה מידע על הסוג בצד ימין, סתם הוגדר אופרטור היהלום של Java SE 7. Java SE 8: חברת Oracle משפרת הרבה את הקונספט של הסקירה של הסוג ב-Java SE 8. אנו משתמשים בקונספט זה כדי להגדיר ביטויי Lambda, פונקציות, הפניות למתודות וכו'.
ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;
הנה קומפילר Java מסתכל על ההגדרת סוג הזמין בצד שמאל ומקבע את סוג פרמטרי ביטוי Lambda a ו־b כמספרים שלמים. זהו כל העניין בשאלות ראיון Java 8. דיברתי על כמה שאלות ראיון Java SE 8 בפוסט זה ואדבר על כמה שאלות ראיון Java SE 8 נוספות בפוסטים הבאים שלי. אשמח אם תשאיר לי תגובה אם אהבת את הפוסט שלי או יש לך כל סוג של בעיה/הצעה.
Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part1