JavaRush /בלוג Java /Random-HE /ניתוח שאלות ותשובות מראיונות למפתח Java. חלק 8

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

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

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

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

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() -> בחר באילו שדות מחלקה צריכים להשתתף -> והלוואי, יישום אוטומטי של השיטות הושלמו. הנה דוגמה לאופן שבו תיראה שיטה שיווצרה אוטומטית עבור מחלקה פשוטה של ​​Cat עם שני שדות - 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);
}
אם אנחנו מדברים על ההבדל בין == לשווים עבור enums , אין הרבה ממנו. אחרי הכל, enum מאחסן קבועים, וגם כאשר משווים ערכים דומים באמצעות == , נקבל true , שכן ההפניות יהיו תמיד לאותם אובייקטים. ובכן, כשמשתמשים ב-equals, גם נעבוד נכון את הפונקציונליות, במיוחד אם תיכנסו לגוף השיטה equals עבור enum , תראו שבמחלקה Enum המימוש של השיטה הוא כך: כלומר, בפנים - ההשוואה הישנה והטובה לפי הפניה! לסיכום: עבור enum , ההשוואה הן דרך == והן שווה היא נכונה.ניתוח שאלות ותשובות מראיונות למפתח Java.  חלק 8 - 2ניתוח שאלות ותשובות מראיונות למפתח Java.  חלק 8 - 3ניתוח שאלות ותשובות מראיונות למפתח Java.  חלק 8 - 4

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

כאשר קוראים למתודה int ordinal() על אלמנט 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 ). הבנת התכונות הללו עוזרת לנו לכתוב קוד טוב יותר.ניתוח שאלות ותשובות מראיונות למפתח Java.  חלק 8 - 5

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

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

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

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

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

זה אפשרי והכרחי! במבט לאחור על התרגול שלי, אני מציין שאחד המקומות הנפוצים ביותר להשתמש ב-enum הוא מבנים לוגיים כמו switch . במקרה זה, אתה יכול לספק את כל הווריאציות האפשריות של מקרה , ולאחר כתיבת ההיגיון עבור כל ערכי ה-enum - ושימוש באופרטור ברירת המחדל אולי אפילו לא יהיה הכרחי! אחרי הכל, אם אתה משתמש במחרוזת או בערך מספרי, למשל, מסוג int , אתה עלול לקבל ערך לא צפוי, שבתורו בלתי אפשרי באמצעות enum . כיצד ייראה מתג עבור הדוגמה שנידונה קודם לכן:
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // некая логика для STUDENT
           break;
       case TEACHER:
           // некая логика для TEACHER
           break;
       case DIRECTOR:
           // некая логика для DIRECTOR
           break;
       case SECURITY_GUARD:
           // некая логика для 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. מה זה Stream ב-Java?

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

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

הנושא נקרא Stream API, אבל השאלה היא לגבי העסקה. הממ... ראשית, בואו נבין מהי עסקה. טרנזקציה היא קבוצה של פעולות רציפות של מסד נתונים המייצגות יחידה לוגית של עבודה עם נתונים. ניתן להשלים עסקה באופן מלא ומוצלח, תוך שמירה על שלמות הנתונים וללא תלות בעסקאות אחרות הפועלות במקביל, או שלא ניתן להשלים אותה כלל, ובמקרה זה אין לה השפעה. אז, לעסקאות יש ארבעה מאפיינים עיקריים, הנקראים בקיצור ACID . הבה נבחן כיצד כל אות של קיצור זה מייצגת: A - Atomity - Atomity - מאפיין זה מבטיח ששום עסקה לא תירשם חלקית במערכת. או שכל פעולות המשנה שלו יבוצעו, או שאף אחת לא תבוצע ( הכל או כלום ). C - עקביות - עקביות היא מאפיין המבטיח שכל עסקה מוצלחת רושמת רק תוצאות תקפות. כלומר, זוהי ערובה שבמקרה של עסקה מוצלחת יתקיימו כל הכללים וההגבלות שהמערכת מטילה על נתונים ספציפיים, אחרת העסקה לא תושלם והנתונים במערכת יחזרו לקדמותם. מדינה. I - Isolation - isolation הוא מאפיין שאומר שבמהלך ביצוע עסקה עסקאות מקבילות לא אמורות להשפיע על התוצאה שלה. מאפיין זה הוא עתיר משאבים, ולכן הוא מיושם בדרך כלל בחלקו על ידי מתן אפשרות לרמות מסוימות של בידוד הפותרות בעיות בידוד מסוימות. נדון בכך ביתר פירוט בשאלה הבאה. ניתוח שאלות ותשובות מראיונות למפתח Java.  חלק 8 - 10ד - עמידות - מאפיין זה מבטיח שאם המשתמש קיבל אישור מהמערכת על השלמת העסקה, הוא יכול להיות בטוח שהשינויים שביצע לא יבוטלו עקב כשל כלשהו. כלומר, אתה יכול להיות בטוח שכשל כלשהו במערכת ההפעלה לא יעשה כלום לנתונים שלך אם כבר קיבלת אישור על השלמת העסקה שלך בהצלחה.

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

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

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

  • קריאה מלוכלכת - תהליך קריאת נתונים שנוספו או השתנו על ידי עסקה שלא אושרה לאחר מכן (מתגלגלת לאחור), כלומר. קריאת נתונים לא חוקיים;

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

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

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

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

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

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

  4. Statement פגיע להזרקות SQL, בעוד PreparedStatement מונע אותן. קרא עוד על ביטול הזרקות SQL ושיטות עבודה מומלצות אחרות באבטחת Java במאמר זה .

אם אתה מתחיל ללמוד את הטכנולוגיה לחיבור אפליקציית Java למסד נתונים - JDBC, אני ממליץ לך להתחיל במאמר זה . ובכן, בשלב זה נעצור היום.ניתוח שאלות ותשובות מראיונות למפתח Java.  חלק 8 - 11
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION