71. מה קורה אם לא נעקוף את שיטת toString() עבור Enum?
נניח שיש לנו את המספר הבא :public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
בואו נציג את התלמיד במסוף על ידי קריאה ל-toString() עליו :
System.out.println(Role.STUDENT.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() -> בחר באילו שדות מחלקה צריכים להשתתף -> והלוואי, יישום אוטומטי של השיטות הושלמו. הנה דוגמה לאופן שבו תיראה שיטה שיווצרה אוטומטית עבור מחלקה פשוטה של 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 , ההשוואה הן דרך == והן שווה היא נכונה.
74. מה עושה השיטה ordinal() ב-Enum?
כאשר קוראים למתודה int ordinal() על אלמנט enum , נקבל את המספר הסידורי מאפס של ערך זה בסדרת הספירות הכללית. הבה נשתמש בשיטה זו על אלמנט אחד מהנושא הקודם שנדון בו - תפקיד :System.out.println(Role.DIRECTOR.ordinal());
בהתאם לכך, הקונסולה תציג:
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);
והקונסולה תציג:
76. איך מתודות ה-ordinal() ו-comareTo() קשורות ב-Enum?
כפי שצוין קודם לכן, () ordinal מחזיר את המספר הסידורי של ערך ברשימת ספירה כללית. כמו כן, בניתוח של השאלה הקודמת, ראית שהרכיבים של ספירות, פעם אחת, למשל, ב- TreeSet (קבוצה מסודרת) מקבלים את הסדר שבו הם מוצהרים ב- enum . וכידוע, TreeSet ו- TreeMap ממיינים אלמנטים על ידי קריאה לשיטת compareTo() שלהם של ממשק Comparable . מכאן נוכל להניח שהמחלקה Enum מיישמת את ממשק Comparable , ומיישמת אותו בשיטת compareTo() , שבתוכה נעשה שימוש ב-ordinal() לקביעת סדר המיון. לאחר שנכנסנו למחלקה Enum , אנו רואים אישור לכך: וגוף השיטה עצמה: המתודה () ordinal אינה נקראת כאן. במקום זאת, נעשה שימוש במשתנה הסידורי - המספר הסידורי של האלמנט בספירה. שיטת ה- ordinal() עצמה היא לא יותר מ-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);
}
המסוף יציג את הפלט הבא:
Stream API
80. מה זה Stream ב-Java?
Java Stream היא דרך חדשה יחסית ליצירת אינטראקציה עם זרם נתונים, אשר בתורה מאפשרת לך לעבד נתונים גדולים בצורה נוחה וקומפקטית יותר, כמו גם לבצע במקביל עיבוד נתונים בין מספר מסוים של שרשורים, מה שיכול לתת שיפור ביצועים בשימוש פונקציונליות. לא ניתן לדון בנושא זה בצורה מעמיקה יותר בקצרה, אז אשאיר כאן קישור למאמר שיכול לעזור לכם לצלול לנושא זה.81. מהם המאפיינים העיקריים של עסקאות?
הנושא נקרא Stream API, אבל השאלה היא לגבי העסקה. הממ... ראשית, בואו נבין מהי עסקה. טרנזקציה היא קבוצה של פעולות רציפות של מסד נתונים המייצגות יחידה לוגית של עבודה עם נתונים. ניתן להשלים עסקה באופן מלא ומוצלח, תוך שמירה על שלמות הנתונים וללא תלות בעסקאות אחרות הפועלות במקביל, או שלא ניתן להשלים אותה כלל, ובמקרה זה אין לה השפעה. אז, לעסקאות יש ארבעה מאפיינים עיקריים, הנקראים בקיצור ACID . הבה נבחן כיצד כל אות של קיצור זה מייצגת: A - Atomity - Atomity - מאפיין זה מבטיח ששום עסקה לא תירשם חלקית במערכת. או שכל פעולות המשנה שלו יבוצעו, או שאף אחת לא תבוצע ( הכל או כלום ). C - עקביות - עקביות היא מאפיין המבטיח שכל עסקה מוצלחת רושמת רק תוצאות תקפות. כלומר, זוהי ערובה שבמקרה של עסקה מוצלחת יתקיימו כל הכללים וההגבלות שהמערכת מטילה על נתונים ספציפיים, אחרת העסקה לא תושלם והנתונים במערכת יחזרו לקדמותם. מדינה. I - Isolation - isolation הוא מאפיין שאומר שבמהלך ביצוע עסקה עסקאות מקבילות לא אמורות להשפיע על התוצאה שלה. מאפיין זה הוא עתיר משאבים, ולכן הוא מיושם בדרך כלל בחלקו על ידי מתן אפשרות לרמות מסוימות של בידוד הפותרות בעיות בידוד מסוימות. נדון בכך ביתר פירוט בשאלה הבאה. ד - עמידות - מאפיין זה מבטיח שאם המשתמש קיבל אישור מהמערכת על השלמת העסקה, הוא יכול להיות בטוח שהשינויים שביצע לא יבוטלו עקב כשל כלשהו. כלומר, אתה יכול להיות בטוח שכשל כלשהו במערכת ההפעלה לא יעשה כלום לנתונים שלך אם כבר קיבלת אישור על השלמת העסקה שלך בהצלחה.82. מהן רמות הבידוד של העסקאות?
כפי שאמרתי קודם, מתן בידוד ACID הוא תהליך עתיר משאבים. לכן, נכס זה מרוצה חלקית. ישנן רמות שונות של בידוד, וככל שהרמה גבוהה יותר, כך ההשפעה על הפריון גדלה. לפני שנעבור לרמות בידוד עסקאות, עלינו לבחון את הבעיות השונות של בידוד עסקאות לא מספיק :-
קריאת פנטום - כאשר אותה מדגם (אותה שאילתה) נקראת שוב ושוב בתוך אותה עסקה, הנתונים המתקבלים שונים, מה שמתרחש עקב הכנסת נתונים על ידי טרנזקציה אחרת;
-
קריאה לא חוזרת - כאשר אותה מדגם (אותה שאילתה) נקראת שוב ושוב בתוך אותה עסקה, הנתונים המתקבלים שונים, מה שמתרחש עקב שינויים (עדכון) ומחיקות נתונים על ידי עסקה אחרת;
-
קריאה מלוכלכת - תהליך קריאת נתונים שנוספו או השתנו על ידי עסקה שלא אושרה לאחר מכן (מתגלגלת לאחור), כלומר. קריאת נתונים לא חוקיים;
-
עדכון אבוד - כאשר טרנזקציות שונות משנות את אותם נתונים בו-זמנית, כל השינויים מלבד האחרון הולכים לאיבוד (מזכיר את בעיית "מצב הגזע" בסביבה מרובת הליכי הליכי).
רמת בידוד | קריאת פנטום | קריאה לא חוזרת | קריאה מלוכלכת | עדכון אבד |
---|---|---|---|---|
ניתן לסידרה | + | + | + | + |
קריאה ניתנת לחזרה | - | + | + | + |
קרא מחויב | - | - | + | + |
קרא ללא מחויבות | - | - | - | + |
אף אחד | - | - | - | - |
83. מה ההבדל בין הצהרה ל-PreparedStatement?
וכאן אין מעבר חלק במיוחד לתכונות של טכנולוגיית JDBC . אז, ראשית, בואו נבין מה זה בעצם הצהרה . זהו אובייקט המשמש ליצירת שאילתות SQL. JDBC משתמש בשלושה סוגים - Statement , PreparedStatement ו- CallableStatement . לא נסתכל על CallableStatement היום: בואו נדבר על ההבדל בין Statement לבין PreparedStatement .-
הצהרה משמשת לביצוע שאילתות SQL פשוטות ללא פרמטרים נכנסים המוכנסים באופן דינמי. נעשה שימוש ב-PrepareStatement עם היכולת להוסיף פרמטרי קלט באופן דינמי.
-
כדי להגדיר פרמטרים ב- PreparedStatement, פרמטרי קלט בבקשה נכתבים כסימני שאלה, כך שניתן יהיה להוסיף ערך במקום זאת באמצעות קובעים שונים, כגון setDouble() , setFloat() , setInt() , setTime() ... . כתוצאה מכך, לא תכניס את סוג הנתונים השגויים לשאילתה שלך.
-
PreparedStatement "קומפילציה מראש" ומשתמשת במטמון, כך שהביצוע שלו יכול להיות מעט יותר מהיר מאשר שאילתה מאובייקטי Statement . כתוצאה מכך, שאילתות SQL המופעלות לעתים קרובות נכתבות כאובייקטי PreparedStatement כדי לשפר את הביצועים .
-
Statement פגיע להזרקות SQL, בעוד PreparedStatement מונע אותן. קרא עוד על ביטול הזרקות SQL ושיטות עבודה מומלצות אחרות באבטחת Java במאמר זה .
GO TO FULL VERSION