שאלון מחרוזות ב-Java

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

המחרוזת נפוצה מאוד כשמדובר בשאלות ראיונות או חידונים ב-Java. לכן אני אגבתי כמה שאלות חשובות ומסובכות במחרוזות ב-Java שאתה יכול לנסות.

חידון מחרוזות ב-Java

ישנם 21 שאלות בחידון זה. אם תוכל לענות נכון על 15 או יותר, אז תכלית טוב במחרוזות. תוכל לבדוק את התשובה וההסבר המפורט על ידי לחיצה על לחצן "חשוף תשובה" לאחר כל שאלה.

בוא נתחיל את חידון המחרוזות ובהצלחה.

1. מה יהיה הפלט של ההצהרות הבאות?

String s = "Java String Quiz";
System.out.println(s.charAt(s.toUpperCase().length()));

A. Convert “Z” to int 90 and prints “90”
B. Runtime Exception
C. Prints “z”
D. Prints “Z”

Click to Reveal Answer

**תשובה נכונה: B
**
זה יזרוק יוצא מן הכלל בזמן הריצה. Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 16 זה קורה משום שערך האינדקס מתחיל מ-0.

2. מה יהיה הפלט של ההצהרות הבאות?

String s = "Java String Quiz";
System.out.println(s.substring(5,3));

A. Prints “Str”
B. Runtime Exception
C. IndexOutOfBoundsException Runtime Exception
D. StringIndexOutOfBoundsException Compile-time error

Click to Reveal Answer

**תשובה נכונה: B
**
זה יזרוק יוצא מן הכלל עם הודעת שגיאה Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 5, end 3, length 16. זה קורה משום שאינדקס הסיום קטן מאינדקס ההתחלה.

3. בחר את כל השיטות התקינות של מחלקת המחרוזת.

A. trim()
B. intern()
C. toLower()
D. split()

Click to Reveal Answer

תשובה נכונה: A, B

שיטות תקפות של מחלקת המחרוזות הן – trim(), intern(), toLowerCase() ו- split(String regex).

4. מה תהיה הפלט של ההצהרות הבאות?

String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.print(s1 == s2);
System.out.print(s1 == s3);

A. truefalse
B. truetrue
C. falsefalse
D. falsetrue

Click to Reveal Answer

**תשובה נכונה: A
**
כאשר אנחנו משתמשים בגרשיים כפולות כדי ליצור מחרוזת, היא ראשית מחפשת אחר מחרוזת עם אותה ערך בבריכת המחרוזות. אם נמצא, אז זה מחזיר את ההפניה; אחרת, הוא יוצר מחדש מחרוזת חדשה בבריכה ואז מחזיר את ההפניה.

אבל בשימוש באופרטור new, אנחנו כובלים את מחלקת המחרוזות ליצור אובייקט מחרוזת חדש בשטח ההיש החדש. לכן s1 ו- s2 יהיו מצביעים לאותה מחרוזת בבריכה, ולעומתם s3 יהיה אובייקט שונה מחוץ לבריכה, ובכך הוא יחזיר את הפלט.

5. אילו מההצהרות הבאות נכונות למחרוזת במקרה switch?

A. String is allowed in switch case for Java 1.5 or higher versions.
B. String is allowed in switch case for Java 1.7 or higher versions.
C. The equals() method is used by switch-case implementation, so add null check to avoid NullPointerException.

Click to Reveal Answer

תשובה נכונה: B, C

למידע נוסף ראה java switch case string

6. אילו מההצהרות הבאות נכונות למחלקות StringBuffer ו- StringBuilder?

A. StringBuilder is not thread-safe.
B. StringBuffer is thread safe because its methods are synchronized.
C. StringBuilder was introduced in Java 1.4
D. StringBuffer and StringBuilder are immutable.

Click to Reveal Answer

תשובה נכונה: A, B

אובייקט StringBuffer הוא תכנה עם תכונות טריד-בטוחות מאחר ושיטותיו מסונכרנות. אך זה מהווה עומס ברוב המקרים, ולכן נוצרה מחלקה נוספת בשם StringBuilder ב-Java 1.5. StringBuilder אינו טריד-בטוח. מחלקות StringBuffer ו- StringBuilder הן מחלקות משתנות. למידע נוסף ראה String vs StringBuffer vs StringBuilder.

7. ביצוע המחרוזת עוקב אחרי התבנית הבאה?

A. Flyweight Design Pattern
B. Factory Pattern
C. Singleton Pattern
D. None of the above

Click to Reveal Answer

תשובה נכונה: A

מימוש מחסנית מחרוזות עוקב אחר תבנית עיצוב הפליווויט (flyweight design pattern).

8. מה יהיה פלט ההצהרות הבאות?

String s1 = "abc";
String s2 = "def";
System.out.println(s1.compareTo(s2));

A. 0
B. true
C. -3
D. false

Click to Reveal Answer

**תשובה נכונה: C
**
מתוך תיעוד של שיטת compareTo() במחרוזת:

שיטת compareTo משווה בין שתי מחרוזות לקסיקוגרפית. ההשוואה מבוססת על ערך היוניקוד של כל תו במחרוזות. הרצף התווים שמיוצג על ידי אובייקט המחרוזת הזו משווה לקסיקוגרפית לרצף התווים שמיוצג על ידי מחרוזת הארגומנט. התוצאה היא מספר שלילי אם אובייקט המחרוזת הזו מקדימה לקסיקוגרפית את מחרוזת הארגומנט. התוצאה היא מספר חיובי אם אובייקט המחרוזת הזו מקדימה לקסיקוגרפית את מחרוזת הארגומנט. התוצאה היא אפס אם המחרוזות שוות; compareTo מחזיר אפס בדיוק כששיטת equals(Object) הייתה מחזירה נכון.

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

this.charAt(k)-anotherString.charAt(k)

בדוגמה שלנו, הסדר "abc" מקדים את "def", לכן מוחזר מספר שלילי. לאחר מכן, האינדקס הנמוך ביותר עם תו שונה הוא 0 והפער בין a ל-d הוא -3.

9. מה יהיה הפלט של התוכנית הבאה?

public class Test {
	public static void main(String[] args) {
		String x = "abc";
		String y = "abc";
		x.concat(y);
		System.out.print(x);
	}
}

A. abc
B. abcabc
C. null

Click to Reveal Answer

תשובה נכונה: A

הפונקציה x.concat(y) תיצור מחרוזת חדשה אך היא לא מוקצת ל-x, לכן ערך ה-x לא משתנה.

10. מה יהיה הפלט של התוכנית הבאה?

public class Test {
	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = "abc";
		System.out.println("s1 == s2 is:" + s1 == s2);
	}
}

A. false
B. s1 == s2 is:true
C. s1 == s2 is:false
D. true

Click to Reveal Answer

תשובה נכונה: A

ההצהרות הנתונות יחזירו "false" משום שב-Java קדימות האופרטור + גבוהה יותר מקדימות האופרטור ==. לכן, הביטוי יתבצע ויחזיר "s1 == s2 is:abc" == "abc", כלומר false.

11. מה יהיה הפלט של ההצהרות הבאות?

String s = "Java"+1+2+"Quiz"+""+(3+4);
System.out.println(s);

A. Java3Quiz7
B. Java12Quiz7
C. Java12Quiz34
D. Java3Quiz34

Click to Reveal Answer

תשובה נכונה: B

לפני הכל, הביטוי בסוגריים יתבצע. לאחר מכן, האופרטורים + יתבצעו משמאל לימין.

קיבלנו מחרוזת בכל הצמתים, ולכן הפלט מתייצב כמפורט למטה.

"Java"+1+2+"Quiz"+""+(3+4)
= "Java"+1+2+"Quiz"+""+7
= "Java1"+2+"Quiz"+""+7
= "Java12"+"Quiz"+""+7
= "Java12Quiz"+""+7
= "Java12Quiz"+7
= "Java12Quiz7"

12. כמה אובייקטים מחרוזות נוצרים בהצהרות הבאות?

String s = "abc"; // statement 1
String s1 = new String("abcd"); // statement 2

A. 1
B. 2
C. 3
D. 4

Click to Reveal Answer

תשובה נכונה: C

בהצהרה 1, נוצר "abc" בבריכת המחרוזות.

בהצהרה 2, תחילה נוצר "abcd" בבריכת המחרוזות. לאחר מכן, הוא מועבר כארגומנט לאופרטור המחרוזת החדשה ומתבצע יצירת מחרוזת נוספת בזיכרון ההיפ.

לכן, נוצרים בסך הכל 3 אובייקטי מחרוזת.

13. מה יהיה הפלט של ההצהרות הבאות?

String s1 = "abc";
String s2 = new String("abc");
System.out.print(s1==s2);
System.out.println(s1==s2.intern());

A. falsetrue
B. falsefalse
C. truetrue
D. truefalse

Click to Reveal Answer

תשובה נכונה: A

s1 נמצא בבריכת המחרוזות בעוד s2 נוצר בזיכרון ההיפ.

לכן, s1 == s2 יחזיר false.

כאשר נקרא לשיטת s2.intern(), היא בודקת אם קיימת מחרוזת עם הערך "abc" בבריכה. לכן, היא מחזירה את ההפניה של s1. כעת, גם s1 וגם s2 מצביעים לאותה מחרוזת.

לכן, s1 == s2.intern() יחזיר true.

14. בחר את כל הממשקים שממומשים על ידי המחלקה String.

A. Serializable
B. Comparable
C. Constable
D. Cloneable

Click to Reveal Answer

תשובה נכונה: A, B, C

String הוא ממשק Serializable ו-Comparable. Constable הוא ממשק חדש מגרסת Java 12.

15. בחר את כל הסיבות שהופכות מחרוזת למועמד מושלם כמפתח של Map?

A. String is immutable
B. String is final
C. String properly implements hashCode() and equals() method
C. String hashcode is cached

Click to Reveal Answer

**תשובה נכונה: A, B, C
**
מימוש תקין של שיטות hashCode() ו-equals() הוא חובה עבור מפתח של Map. מאחר והמחרוזת היא סופית ובלתי משתנה, אין סיכוי לפגיעה בנתוני המפתח.

16. מה יהיה הפלט של קטע הקוד הבא?

String s1 = new String("java");
String s2 = new String("JAVA");
System.out.println(s1 = s2);

A. JAVA
B.java
C. true
D. false

Click to Reveal Answer

**תשובה נכונה: A
**
התוכן של println() יודפס כ "JAVA" מכיוון שהארגומנט בתוך שיחת השיטה הוא השמה. לכן, זה יתייחס כ System.out.println("JAVA").

17. מה יהיה הפלט של ההצהרות הבאות?

String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));

A. false
B. true
C. ClassCastException at runtime
D. Compile-time error

Click to Reveal Answer

תשובה נכונה: A

זה ידפיס שקר כי s2 אינו מסוג String. אם תבדוק את יישום של פעולת השוואה של String, תמצא בדיקה באמצעות האופרטור instanceof כדי לבדוק אם סוג האובייקט שנשלח הוא String? אם לא, אז יוחזר שקר.

18. מה יהיה הפלט של קטע הקוד שלמטה?

String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);

A. false
B. true
C. null

Click to Reveal Answer

תשובה נכונה: A

זו שאלה מטריקה והפלט יהיה שקר. אנו יודעים ששיטת intern() תחזיר את הפניה לאובייקט String מבריכת המחרוזת, אך מאחר שלא הקצנו אותה חזרה ל-s2, אין שינוי ב-s2. לכן שני s1 ו-s2 מצביעים על פניות שונות.

אם נשנה את הקוד בשורה 3 ל-s2 = s2.intern(); אז הפלט יהיה אמת.

19. בחר את כל המחלקות שהן תתי מחלקת String.

A. StringBuffer
B. StringBuilder
C. StringWriter
D. None

Click to Reveal Answer

**תשובה נכונה: D
**
**
זו שאלה מטריקה. מחלקת ה-String היא מחלקה סופית, ולכן לא ניתן להרחיב אותה.

20. אילו מהציוות הבאות נכונות לגבי String ב-Java?

A. We can extend String class like StringBuffer does it.
B. String class is defined in java.util package.
C. String is immutable in Java.
D. String is thread-safe in Java.
E. String is case sensitive in Java.

Click to Reveal Answer

תשובה נכונה: C, D, E

אנו לא יכולים להרחיב את מחלקת String משום שהיא סופית. StringBuffer אינו מרחיב אותה. מחלקת String מוגדרת בחבילת java.lang. המחרוזת היא לא נעולה ולכן בטוחה לשימוש מרובה-לתה. מחרוזת רגישה לאותות, לכן "abc" אינו שווה ל-"ABC".

21. מה יהיה הפלט של ההצהרות למטה?

String s1 = null;
System.out.print(s1); // line 2
System.out.print(s1.toString()); // line 3

A. nullnull
B. null followed by NullPointerException
C. NullPointerException

Click to Reveal Answer

תשובה נכונה: B

שורה 2 תדפיס null מאחר ול-metod print יש בדיקת null כזו:

if (s == null) { s = "null";}

שורה 3 תזרום NullPointerException מכיוון שאנו מנסים לקרוא לפונקציית toString() על ערך שהוא null.

מסקנה

I have tried to cover most of the important points about String in this Quiz. If you think some interesting concept has been missed, please let me know through comments. If you liked the Quiz, share it with others too.

Source:
https://www.digitalocean.com/community/tutorials/java-string-quiz