→ חזרו אחורה

פרק 7 - מחרוזות

⏱ 14 דקות קריאה

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

1. מחרוזת היא רצף של תווים

אפשר לחשוב על המחרוזת "Java" כעל מערך של 4 תווים: J, a, v, a - ולכל תו יש אינדקס, בדיוק כמו במערך, שמתחיל מ-0.

2. אורך מחרוזת: length()

Java

String word = "Java";
System.out.println(word.length());
            
שימו לב:length() נכתב עם סוגריים, כי היא מתודה - שלא כמו מערך, שבו כתבנו numbers.length בלי סוגריים.

3. גישה לתו בודד: charAt()

Java

String word = "Java";
System.out.println(word.charAt(0));
System.out.println(word.charAt(3));
            

word.charAt(0) מחזיר את התו הראשון: J.

word.charAt(3) מחזיר את התו הרביעי (אינדקס 3): a.

4. השוואת מחרוזות: equals() ולא ==

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

Java

String name1 = "Java";
String name2 = "Java";

System.out.println(name1.equals(name2));
            
⚠️ למה לא ==?== על String משווה אם מדובר באותו אובייקט ממש בזיכרון, ולא בהכרח אם התוכן זהה. זה עלול לעבוד נכון לפעמים במקרה, ולהיכשל בפעמים אחרות - לכן הכלל הוא: תמיד equals() להשוואת תוכן של מחרוזות.

5. פעולות שימושיות נוספות

פעולה מה היא עושה דוגמה
substring(a, b) מחזירה חלק מהמחרוזת, מאינדקס a עד לפני b "Java".substring(1, 3)"av"
toUpperCase() מחזירה את המחרוזת באותיות גדולות "java".toUpperCase()"JAVA"
indexOf(x) מחזירה את האינדקס הראשון של x, או -1 אם לא נמצא "Java".indexOf("v")2

6. מעבר על מחרוזת עם לולאה

בדיוק כמו במערך, אפשר לעבור על כל התווים במחרוזת בעזרת לולאת for ו-charAt:

Java

String word = "Java";
int vowelCount = 0;

for (int i = 0; i < word.length(); i++) {
    char c = word.charAt(i);
    if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
        vowelCount++;
    }
}

System.out.println("תנועות: " + vowelCount);
            

זה בדיוק אותו "מונה" שהכרנו בפרק המערכים - רק שהפעם עוברים על תווים של מחרוזת ולא על תאי מערך.

שימו לב: תו בודד מושווה בעזרת == (כי char הוא טיפוס פרימיטיבי, לא אובייקט).

7. טעויות נפוצות

שימוש ב-== במקום equals(): כפי שראינו למעלה - הטעות הכי נפוצה בהשוואת תוכן מחרוזות.

אינדקס מחוץ לטווח: קריאה ל-charAt עם אינדקס גדול מדי (או שלילי) תזרוק שגיאת StringIndexOutOfBoundsException.

🎓 זווית הבגרות

איך זה מופיע בבגרות: מחרוזות מופיעות כמעט בכל שאלה שיש בה טקסט - חיפוש תו, ספירת תווים מסוג מסוים, או פירוק מחרוזת לחלקים.

סוג שאלה טיפוסי: מעבר על כל תווי המחרוזת בלולאה עם charAt כדי לספור/לבדוק תנאי על כל תו - בדיוק כמו מעבר על מערך.

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

מה לזכור למבחן: תמיד equals() להשוואת תוכן של שתי מחרוזות; == תקין רק בהשוואת תו בודד (char).

8. תרגול

מה יודפס למסך על ידי הקוד הבא?

Java
String s = "hello";
System.out.println(s.charAt(1) + "" + s.charAt(4));

כתבו קוד שמדפיס את האורך של המחרוזת word.

כתבו קוד שמדפיס את התו הראשון של המחרוזת word.

כתבו תנאי שבודק אם המחרוזת name1 שווה בתוכנה למחרוזת name2, על ידי קריאה למתודה equals על name1.

פרק 6 - מתודות פרק 8 - מערך דו-ממדי