אם אי פעם התכוננתם לראיון לתפקיד מתכנת ג'אווה או ניגשתם למבחן כלשהו (לאו דווקא בתכנות) כדי לקבל תעודה, אז סביר להניח שכבר שמתם לב שהשאלות שהם שואלים מאוד ספציפיות. רבים מהם גורמים לך לחשוב על הארכיטקטורה של השפה, חלקם מיועדים לידע מעמיק. יש גם כאלה שדומים יותר לחידות או נוגעות לניואנסים שקשה מאוד להרגיש בלי תרגול. במאמר זה, המפתח Saraans Singh מספק מספר שאלות Java כאלה. עם תשובות כמובן. 1. מה קורה אם תשים משפט return או System.exit() בבלוק try/catch? זוהי שאלת "להדביק" מאוד פופולרית בג'אווה. הטריק שלו הוא שמתכנתים רבים מאמינים שהבלוק
finally
יבוצע בכל מקרה. שאלה זו מאתגרת את המושג הזה על ידי הצבת משפט return
בבלוק try/catch
או קריאה מבלוק try/catch
משפט System.exit ()
. התשובה לשאלה המסובכת הזו: הבלוק finally
יתבצע כאשר הצהרה מוצבת return
בבלוק try/catch
, ולא יתבצע כאשר נקרא מבלוק try/catch
הצהרה System.exit ()
. 2. האם Java תומך בירושה מרובה? זו שאלה מאוד מסובכת. מראיינים אומרים לעתים קרובות: אם C++ יכול לתמוך בירושה ישירה מרובה, מדוע Java לא יכולה? התשובה קצת יותר מסובכת ממה שזה נראה, מכיוון ש-Java תומכת בירושה מסוגים מרובים, מכיוון שממשק בו יכול להרחיב ממשקים אחרים. אבל שפת Java אינה תומכת בהורשה מרובה של יישומים. 3. במקרה שבו מתודה זורקת חריגה NullPointerException
במחלקת האב, האם ניתן לעקוף אותה על ידי המתודה שזורקת RuntimeException
? שאלה מסובכת נוספת קשורה למושגים של עומס יתר ועקיפה. תשובה: אתה יכול בבטחה לזרוק חריג מחלקה אב בשיטה שנדחקה NullPointerException – RuntimeException
, אבל אתה לא יכול לעשות את אותו הדבר עם חריג מסומן מסוג Exception
. 4. כיצד להבטיח ששרשורים יכולים לגשת למשאבים ללא תקלה? N
N
אם אתה לא ממש טוב בכתיבת קוד מרובה חוטים, השאלה הזו תהיה ממש מסובכת עבורך. זה יכול להיות מאתגר אפילו למתכנת מנוסה שלא התמודד עם מבוי סתום ותנאי מירוץ. הטריק כאן הוא בסדר: ניתן למנוע מבוי סתום על ידי שחרור משאבים בסדר הפוך שבו הם נרכשו. 5. מה ההבדל בין מחלקות StringBuffer
לשפת StringBuilder
ג'אווה? שאלה קלאסית על שפת Java, שנחשבת מסובכת על ידי מפתחים מסוימים ופשוטה מאוד על ידי אחרים. המחלקה StringBuilder
הוצגה ב-JDK 1.5 וההבדל היחיד ביניהן הוא שהשיטות של המחלקה StringBuffer
, למשל, length()
או capacity()
, append()
מסונכרנות, בעוד שהשיטות המקבילות של המחלקה StringBuilder
אינן. בגלל ההבדל הבסיסי הזה, שרשור מחרוזות StringBuilder
מהיר יותר עם StringBuffer
. למעשה, StringBuffer
לא מומלץ להשתמש, שכן ב-99% ממקרי השימוש, שרשור מחרוזות מתבצע על אותו חוט. 6. מה מחזיר הביטוי 1.0/0.0? האם זה יזרוק חריג או יגרום לשגיאת קומפילציה? עוד שאלה מסובכת על הכיתה Double
. למרות שמפתחי Java מודעים לסוג הנתונים הפשוטים כפול ול-class Double
, בעת ביצוע פעולות נקודה צפה, הם לא מקדישים מספיק תשומת לב ל- Double.INFINITY
, NaN
, -0.0
ולכללים השולטים בחישובים האריתמטיים הקשורים אליהם. התשובה לשאלה זו פשוטה: שום חריג ArithmeticException
לא יזרק, הערך יוחזר Double.INFINITY
. 7. מה קורה אם מנסים להכניס HashMap
אובייקט מפתח לאובייקט מפתח שכבר קיים בו? השאלה המסובכת הזו היא חלק משאלת נפוצה נוספת: איך הם עובדים HashMap
בג'אווה? HashMap
הוא נושא פופולרי לשאלות מבלבלות ובעייתיות על שפת ג'אווה. התשובה היא שאם תנסה להכניס מחדש מפתח לתוך HashMap
, הוא יחליף את הישן מכיוון שהמחלקה HashMap
לא מאפשרת שכפול מפתחות. ואותו מפתח פירושו אותו קוד חשיש, כך שהוא יגיע לאותו מקום בקטע ה-hash. מבוסס על חומרים מ-Quora
GO TO FULL VERSION