CodeGym /בלוג Java /Random-HE /בחינת שאלות ותשובות מראיון עבודה למשרת מפתח Java. חלק 8
John Squirrels
רָמָה
San Francisco

בחינת שאלות ותשובות מראיון עבודה למשרת מפתח Java. חלק 8

פורסם בקבוצה
פרקטיקה או תיאוריה? מה יותר חשוב? אנשים רבים יאמרו באופן טבעי שהתרגול חשוב יותר. כאילו, תתאמן עד שהשמש תשקע ותהיה מאושר. אני אעז לא להסכים עם זה. בחינת שאלות ותשובות מראיון עבודה למשרת מפתח Java.  חלק 8 - 1במהלך ראיונות, אף אחד לעולם לא יידע כמה אתה מגניב כשאתה מתאמן. במקום זאת, תתבקשו להדגים את צלעות התיאוריה שלכם. רק מאוחר יותר, כשעברת את כל שכבות הראיונות ותתחבר לפרויקט, תיישם את כישוריך המעשיים. אתה יכול להתנגד ולומר שלפעמים הם נותנים לך משימת מבחן, אז עדיין יש צורך בתרגול. אני לא חולק, אבל הנקודה שלי היא שזה לפעמים, אבל אתה תמיד צריך להפגין ידע בתיאוריה בראיון. האם אתה מרגיש את ההבדל? כל זה אומר שאתה חייב שיהיה לך בסיס תיאורטי מוצק מתחת לרגליים, וזה מה שאנחנו הולכים לבנות היום. ליתר דיוק, נמשיך לבחון שאלות שנשאלות לעתים קרובות בראיונות.

71. מה קורה אם לא נעקוף את שיטת toString() של Enum?

נניח שיש לנו את המספר הבא :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
בואו נציג את השדה STUDENT במסוף על ידי קריאה לשיטת toString() שלו :
System.out.println(Role.STUDENT.toString());
כתוצאה מכך, אנו מקבלים את הפלט הבא של המסוף:
סטוּדֶנט
לפיכך, אנו רואים שעבור enum , יישום ברירת המחדל של toString() מחזיר את שם הקבוע עצמו.

72. האם אתה יכול להכריז על בנאי בתוך Enum?

כן כמובן. הבנאי הוא זה שקובע את הערכים של השדות הפנימיים של ה- enum . כדוגמה, הבה נוסיף שני שדות למצוין הקודם ( ageFrom ו ageTo ) כדי לציין את טווח הגילאים עבור כל תפקיד:
public enum Role {
   STUDENT(5,18),
   TEACHER(20,60),
   DIRECTOR(40,70),
   SECURITY_GUARD(18,50);

   int ageFrom;
   int ageTo;

   Role(int ageFrom, int ageTo) {
       this.ageFrom = ageFrom;
       this.ageTo = ageTo;
   }
}

73. מה ההבדל בין == לבין שווה()?

זוהי אחת משאלות הראיון הנפוצות ביותר שנשאלות מפתחי Java לעתיד. מלכתחילה, כאשר משווים ערכים פשוטים ( int , char , double ...), אנו משתמשים ב == , שכן משתנים אלו מכילים ערכים קונקרטיים שניתן להשוות ישירות. יתרה מכך, משתנים פרימיטיביים אינם אובייקטים מלאים - הם לא יורשים את המחלקה Object ואין להם מתודה equals() . אם אנחנו מדברים על השוואת משתנים שמתייחסים לאובייקטים, אז צריך לדעת ש == משווה רק את הערך של הפניות, כלומר האם הן מתייחסות לאותו אובייקט או לא. גם אם כל הנתונים באובייקט אחד זהים לכל הנתונים באחד אחר, שימוש ב -== לצורך השוואה יניב תוצאה שלילית ( false ), מכיוון שהם אובייקטים נפרדים. כפי שאולי ניחשתם, אנו משתמשים בשיטת equals() כדי להשוות בין משתני התייחסות. זוהי אחת מהשיטות הסטנדרטיות של מחלקת Object , והיא הכרחית להשוואה מלאה של אובייקטים. אבל אני צריך לומר מיד שכדי שהשיטה הזו תעבוד נכון, יש לעקוף אותה כדי לציין איך בדיוק יש להשוות בין האובייקטים. אם לא תעקוף את השיטה, תקבל את מימוש ברירת המחדל, אשר משווה בין האובייקטים באמצעות == . ב-IntelliJ IDEA, אתה יכול לעקוף אותו באופן אוטומטי באמצעות קיצור דרך IDEA: Alt+Insert . בחלון שמופיע, בחר equals() ו- hashCode() . לאחר מכן בחר את השדות שצריכים להיות מעורבים. וואלה! השיטות מיושמות אוטומטית. הנה דוגמה לאופן שבו נראית שיטה שיווצרה אוטומטית עבור מחלקת החתול הפשוטה ביותר האפשרית עם שני שדות - int age ו- String name :
@Override
public boolean equals(final Object o) {
   if (this == o) return true;
   if (o == null || this.getClass() != o.getClass()) return false;
   final Cat cat = (Cat) o;
   return this.age == cat.age &&
           Objects.equals(this.name, cat.name);
}
כשמדובר ב- enum , אין הבדל מעשי בין == לבין equals() . בחינת שאלות ותשובות מראיון עבודה למשרת מפתח Java.  חלק 8 - 2אחרי הכל, enum מאחסן קבועים, וגם כאשר נשווה ערכים זהים באמצעות == , נקבל אמת , שכן ההפניות המושוות יצביעו תמיד על אותם אובייקטים. ושימוש ב- equals() מביא לנו גם את התוצאה הנכונה. אם תיכנסו לגוף שיטת equals עבור Enum , תראו שלמחלקת Enum יש את המימוש הבא: בחינת שאלות ותשובות מראיון עבודה למשרת מפתח Java.  חלק 8 - 3בפנים נוכל לראות השוואה ישנה וטובה של הפניות! לסיכום, עבור enum s, אנו יכולים להשוות בצורה נכונה באמצעות הן == והן equals() . בחינת שאלות ותשובות מראיון עבודה למשרת מפתח Java.  חלק 8 - 4

74. מה עושה שיטת ה-ordinal() של Enum?

כאשר אנו קוראים למתודה int ordinal() בשדה enum , אנו מקבלים את האינדקס מבוסס האפס של השדה ברשימת ערכי ה-enum. הבה נקרא לשיטה זו בשדה ב- Role enum, שחשבנו עליו בעבר:
System.out.println(Role.DIRECTOR.ordinal());
בהתאם לכך, הקונסולה מציגה:
2

75. האם ניתן להשתמש ב-Enum עם TreeSet או TreeMap ב-Java?

אנו יכולים להשתמש בסוגי enum ב- TreeSet וב- TreeMap . ואנחנו יכולים לכתוב את זה:
TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
והקונסולה תציג:
STUDENT TEACHER DIRECTOR SECURITY_GUARD
קיבלנו את הפלט, אבל לא בסדר אלפביתי. הנקודה היא שאם אנו משתמשים בשדות enum כערכי TreeSet או כמפתחות TreeMap , אז השדות ממוינים בסדר הטבעי שלהם (בסדר שבו הם מצוינים ב-enum ) . ההבנה שכך זה עובד עוזרת לנו לכתוב קוד טוב יותר.

76. איך מתודות ה-ordinal() ו- compareTo() של Enum קשורות?

כפי שהוזכר קודם לכן, ordinal() מחזירה אינדקס של שדה ברשימת שדות ה-enum. כמו כן, בבחינת השאלה הקודמת, ראית שכאשר שדות enum מוכנסים ל- TreeSet (שהוא סט ממוין), הם מקבלים את הסדר שבו הם מוצהרים ב- enum . וכידוע, TreeSet ו- TreeMap ממיינים פריטים על ידי קריאה לשיטת compareTo() של ממשק Comparable שלהם . זה אומר לנו שהמחלקה Enum מיישמת את ממשק Comparable , מה שאומר שהיא מיישמת את השיטה compareTo() אשר משתמשת באופן פנימי בשיטה () ordinal כדי לקבוע את סדר המיון. כשנכנסים למחלקה Enum , נוכל לאשר את ההנחה שלנו: בחינת שאלות ותשובות מראיון עבודה למשרת מפתח Java.  חלק 8 - 5והנה גוף השיטה עצמה: השיטה בחינת שאלות ותשובות מראיון עבודה למשרת מפתח Java.  חלק 8 - 6ה- ordinal() אינה נקראת כאן. במקום זאת, נעשה שימוש במשתנה הסידורי , שהוא מספר האינדקס של האלמנט בספירה. שיטת ה- ordinal() עצמה בחינת שאלות ותשובות מראיון עבודה למשרת מפתח Java.  חלק 8 - 7 היא לא יותר מ-Getter עבור המשתנה ה-ordinary .

77. כתוב דוגמה Enum

בשאלות שנדונו לעיל, כבר נתתי דוגמאות ל- enum s. אני לא רואה סיבה לשכפל כאן קוד. לדוגמה, ראה שאלה 72 לגבי קונסטרוקטור ב-enum.

78. האם ניתן להשתמש ב-Enum במארז מתג?

זה יכול להיות וצריך להיות! בהסתכלות על הניסיון שלי, אציין שאחד השימושים הנפוצים ביותר ב- enum הוא במבנים לוגיים כמו הצהרות switch . במקרה זה, אתה יכול לספק את כל המקרים האפשריים - ברגע שאתה כותב את ההיגיון עבור כל שדה enum , אתה אפילו לא צריך פסקת ברירת מחדל ! אחרי הכל, אם אתה משתמש ב-String או בערך מספרי, כגון int , אתה עשוי לקבל ערך לא צפוי, אבל זה בלתי אפשרי עם enum . כך תיראה הצהרת switch עבור הדוגמה שלעיל:
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // some logic for STUDENT
           break;
       case TEACHER:
           // some logic for TEACHER
           break;
       case DIRECTOR:
           // some logic for DIRECTOR
           break;
       case SECURITY_GUARD:
           // some logic for SECURITY_GUARD
           break;
   }
}

79. איך אני מקבל את כל הערכים האפשריים של Enum?

אם אתה צריך לקבל את כל ערכי ה-enum האפשריים, יש שיטה values() שמחזירה מערך של כל הערכים האפשריים עבור ה- enum בסדר הטבעי שלהם (כלומר, בסדר שבו הם מצוינים ב- enum ). דוגמא:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
יהיו לנו הבאות בקונסולה:
STUDENT TEACHER DIRECTOR SECURITY_GUARD

Stream API

80. מהו זרם ב-Java?

ה- API של Java Stream הוא דרך חדשה יחסית לאינטראקציה עם זרם נתונים, המאפשרת לנו לעבד ביג דאטה בצורה נוחה וקומפקטית יותר, כמו גם לעבד נתונים במקביל בין מספר מסוים של זרמים, מה שעלול להגביר את הביצועים.

81. שם את המאפיינים העיקריים של עסקאות

הנושא כאן הוא ה-Stream API, אבל השאלה היא לגבי עסקאות. הממ... ראשית, בואו נבין מהי עסקה. עסקה היא קבוצה של פעולות עוקבות במסד נתונים . הוא מייצג יחידת עבודה הגיונית. עסקה יכולה להתבצע ללא תלות בעסקאות מקבילות אחרות באופן מלא ומוצלח, ובכך לשמור על שלמות הנתונים, או לא לבצע כלל, ובמקרה זה אין לה השפעה. לעסקאות יש ארבעה מאפיינים עיקריים, אותם אנו יכולים לזכור בקלות הודות לראשי התיבות ACID . בואו נראה מה המשמעות של כל אות בראשי התיבות: A מייצג Atomicity . נכס זה מבטיח ששום עסקה לא מתבצעת באופן חלקי במערכת. או שכל פעולות המשנה שלו יבוצעו, או שאף אחת מהן לא תבוצע ( הכל או כלום ). С מייצג עקביות . נכס זה מבטיח שכל עסקה מוצלחת תגרום לתוצאות תקפות בלבד. במילים אחרות, זוהי ערובה לכך שאם העסקה תצליח, אזי יישמעו כל כללי המערכת לנתונים ספציפיים. אם העסקה לא תצליח, אזי היא לא תתבצע ונתוני המערכת יחזרו למצב הקודם. אני מייצג בידוד . מאפיין זה אומר שכאשר עסקה מבוצעת, עסקאות במקביל לא אמורות להשפיע על התוצאות שלה. מאפיין זה הוא עתיר משאבים, ולכן, ככלל, הוא מיושם חלקית, ומאפשר רמות מסוימות של בידוד הפותרות בעיות בידוד ספציפיות. נדון בכך ביתר פירוט בשאלה הבאה. D מייצג עמידות . נכס זה מבטיח שאם המשתמש יקבל אישור שהעסקה הושלמה, אז הוא יכול להיות בטוח שהשינויים לא יבוטלו עקב כשל כלשהו. כלומר, אתה יכול להיות בטוח שכשל כלשהו במערכת ההפעלה לא יעשה שום דבר לנתונים שלך אם כבר קיבלת אישור שהעסקה שלך הסתיימה בהצלחה.

82. מהן רמות בידוד העסקאות?

כפי שאמרתי קודם, כשמדובר במאפייני ACID, הבטחת בידוד היא תהליך עתיר משאבים. בהתאם לכך, נכס זה מיושם חלקית. ישנן רמות שונות של בידוד: ככל שהרמה גבוהה יותר, כך ההשפעה על הביצועים חמורה יותר. לפני שנעבור לרמות בידוד עסקה, עלינו לשקול בעיות שונות המתרחשות עקב בידוד עסקה לא מספיק :
  • הפנטום קורא : כאשר אותה בקשה, הנקראת יותר מפעם אחת בתוך עסקה בודדת, מניבה תוצאות שונות עקב הוספות על ידי עסקה אחרת;

  • קריאות בלתי חוזרות : כאשר אותה בקשה, הנקראת יותר מפעם אחת בתוך עסקה בודדת, מניבה נתונים שונים עקב שינויים (עדכונים) ומחיקות על ידי עסקה אחרת;

  • קריאות מלוכלכות : קריאת נתונים שעדיין לא התחייבו שנוספו או שונו על ידי עסקה ולאחר מכן הוחזרו לאחור;

  • עדכונים אבודים : כאשר בלוק נתונים אחד משתנה בו-זמנית על ידי עסקאות שונות, וכל השינויים מלבד האחרון אובדים (בדומה למצב מרוץ בריבוי הליכי שרשור).

כפי שזה קורה, רמות בידוד עסקאות מאופיינות באילו בעיות בידוד הן מגינות מפניהן. שקול את הטבלה הבאה של רמות הבידוד ואת הבעיות שהם מגנים מפניהן:
רמת בידוד קריאת פנטום קריאות בלתי חוזרות קריאה מלוכלכת עדכון אבד
ניתן לסידרה + + + +
קריאה ניתנת לחזרה - + + +
קרא מחויב - - + +
קרא ללא מחויבות - - - +
אף אחד - - - -
ואל תשכחו את הצד השני: ככל שרמת הבידוד גבוהה יותר, עיבוד העסקאות לוקח יותר זמן (בהינתן ביצוע מקביל של מספר עסקאות).

83. מה ההבדל בין הצהרה ל-PreparedStatement?

כאן שינינו בפתאומיות את המעבר לתכונות של JDBC . בכל מקרה, בואו נבין תחילה על מה מדובר בהצהרה . זהו אובייקט המשמש ליצירת שאילתות SQL. JDBC משתמש בשלושה סוגים: Statement , PreparedStatement ו- CallableStatement . לא נשקול את CallableStatement היום. במקום זאת, אנחנו מדברים על ההבדל בין Statement לבין PreparedStatement .
  1. הצהרה משמשת לביצוע שאילתות SQL פשוטות ללא פרמטרי קלט של זמן ריצה. PrepareStatement יכול לקבל פרמטרי קלט בזמן ריצה.

  2. כדי להגדיר פרמטרים עבור PreparedStatement , פרמטרי קלט נכתבים כסימני שאלה בבקשה, כך שהם יכולים להיות מוחלפים בערך כלשהו באמצעות מגדירים שונים, כגון setDouble() , setFloat() , setInt() , setTime() ... זה פירושו שלא תכניס את סוג הנתונים השגויים לבקשה.

  3. PreparedStatement מורכב מראש ומשתמש ב-Caching, כך שניתן לבצע אותו מעט מהר יותר מאשר בקשה שנעשתה מאובייקטי Statement . כתוצאה מכך, הצהרות SQL המופעלות לעתים קרובות נוצרות כאובייקטי PreparedStatement על מנת לשפר את הביצועים.

  4. הצהרה פגיעה להזרקת SQL, אך PreparedStatement מונעת אותם.

ועם זה, נקרא לזה יום!
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION