המחלקה
String
היא אחת השיעורים הנפוצים ביותר בג'אווה. מאמר זה מספק כמה שאלות ותשובות חשובות לראיונות Java String. הם יעזרו מאוד לקבל תמונה מלאה של הכיתה String
ויכינו אותך לכל String
שאלת ראיון הקשורה לכיתה.
1. מה זה מחרוזת ב-Java? באיזה סוג נתונים מדובר?
String היא מחלקה ב-Java המוגדרת בחבילת java.lang. זה לא סוג נתונים פרימיטיבי כמו int ו-long. המחלקה String מייצגת ערכת תווים של מחרוזת. מחרוזות משמשות כמעט בכל יישומי Java וישנן מספר עובדות שכדאי לדעת על מחלקת String. זהוimmutable
סוג נתונים בלתי ניתן לשינוי ( ) וסופי ב-Java String
והמכונה הוירטואלית מאחסנת את כל האובייקטים של המחלקה במאגר מחרוזות. תכונה נוספת String
היא הדרך להשיג אובייקטי מחלקה String
באמצעות מרכאות כפולות והעמסת יתר של האופרטור "+" לשרשור.
2. מהן הדרכים השונות ליצור אובייקט מחרוזת?
אנו יכולים ליצור אובייקטים באמצעות האופרטור החדש בדיוק כמו כל מחלקה אחרת ב-Java או שאנו יכולים להשתמש במירכאות כפולות כדי ליצור אובייקטString
. ישנם גם מספר בנאי מחלקות String
לקבלת מחרוזת ממערך תווים, מערך בתים, וגם באמצעות StringBuffer
או StringBuilder
.
String str = new String("abc");
String str1 = "abc";
כאשר אנו יוצרים מחרוזת באמצעות מרכאות כפולות, ה-Java Virtual Machine מחפש במאגר המחרוזות מחרוזת נוספת בעלת אותו ערך. אם המחרוזת נמצאה, מוחזרת רק הפניה לאובייקט קיים של המחלקה String
, אחרת נוצר אובייקט חדש עם הערך שהתקבל ומאוחסן במאגר. כאשר אנו משתמשים באופרטור החדש, המכונה הוירטואלית יוצרת אובייקט String
אך אינה מאחסנת אותו במאגר המחרוזות. אנחנו יכולים להשתמש בשיטה intern()
כדי לאחסן מחרוזת במאגר מחרוזות, או לקבל הפניה אם מחרוזת כזו כבר נמצאת בבריכה.
3. כתבו שיטה לבדוק אם מיתר הוא פלינדרום.
מיתר נקרא פלינדרום אם הוא קורא אותו דבר בשני הכיוונים. לדוגמה, "אבא" הוא מיתר פלינדרום. המחלקהString
לא מספקת שום שיטה להיפוך מחרוזת, אבל למחלקות StringBuffer
יש StringBuilder
שיטת היפוך שבעזרתה נוכל לבדוק אם המחרוזת שלנו היא פלינדרום או לא.
private static boolean isPalindrome(String str) {
if (str == null)
return false;
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.reverse();
return strBuilder.toString().equals(str);
}
לפעמים המראיין עשוי לבקש לא להשתמש במחלקות אחרות לבדיקה זו, ובמקרה זה נוכל להשוות את התווים במחרוזת משני הצדדים כדי לבדוק אם יש פלינדרום.
private static boolean isPalindromeString(String str) {
if (str == null)
return false;
int length = str.length();
System.out.println(length / 2);
for (int i = 0; i < length / 2; i++) {
if (str.charAt(i) != str.charAt(length - i - 1))
return false;
}
return true;
}
4. כתבו שיטה להסרת תו נתון ממחרוזת.
אנו יכולים להשתמש בשיטהreplaceAll
כדי להחליף את כל המופעים של מחרוזת במחרוזת אחרת. שימו לב שהמתודה לוקחת מחרוזת כארגומנט, אז אנחנו משתמשים במחלקה Character
כדי ליצור מחרוזת מתו, ומשתמשים בה כדי להחליף את כל התווים במחרוזת הריקה.
private static String removeChar(String str, char ch) {
if (str == null)
return null;
return str.replaceAll(Character.toString(ch), "");
}
5. כיצד נוכל להמיר מחרוזת לאותיות גדולות או קטנות?
אנו יכולים להשתמש בשיטות מחלקותString toUpperCase
כדי toLowerCace
לקבל מחרוזות רישיות וקטנות. לשיטות אלו יש עומס שלוקח ארגומנט Locale
ומשתמש בכללי הלוקליזציה שלו כדי להמיר את המחרוזת לאותיות גדולות או קטנות.
6. מה עושה שיטת subSequence?
Java 1.4 הציגה את הממשקCharSequence
, מחלקה String
יורשת את הממשק הזה וזו הסיבה היחידה ליישם שיטה subSequence
במחלקה String
. פנימית זה קורא ל substring
. דוגמה פשוטה לשימוש בשיטה:
public class StringSubsequence {
public static void main(String[] args) {
String str = "www.journaldev.com";
System.out.println("Last 4 char String: "+str.subSequence(str.length()-4, str.length()));
System.out.println("First 4 char String: "+str.subSequence(0, 4));
System.out.println("website name: "+str.subSequence(4, 14));
//substring vs subSequence
System.out.println("substring == subSequence ? "
+(str.substring(4, 14) == str.subSequence(4, 14)));
System.out.println("substring equals subSequence ? "
+(str.substring(4, 14).equals(str.subSequence(4, 14))));
}
}
הפלט של התוכנית יציג את הדברים הבאים:
Last 4 char String: .com
First 4 char String: www.
website name: journaldev
substring == subSequence ? false
substring equals subSequence ? true
באופן אידיאלי אתה תמיד צריך להשתמש ב substring
.
7. איך להשוות בין שתי מחרוזות ב-Java?
המחלקהString
יורשת את הממשק Comparable
ויש לה שתי אפשרויות שיטה compareTo()
. השיטה compareTo(String anotherString)
משווה את האובייקט לארגומנט String
שהתקבל String
מבחינה לקסיקוגרפית. אם השורה הנוכחית קודמת למחרוזת שהתקבלה, השיטה מחזירה מספר שלם שלילי, ואם המחרוזת עוקבת אחר הארגומנט שהתקבל, היא מחזירה מספר שלם חיובי integer
. אם השיטה מחזירה 0, אז למחרוזת יש אותו ערך, ובמקרה זה השיטה equals(String str)
תחזיר גם true. compareToIgnoreCase(String str)
: שיטה זו דומה לקודמתה, אלא שהיא מתעלמת מרישיות. הוא משתמש ב-CASE_INSENSITIVE_ORDER Comparator להשוואה לא תלוית רישיות. אם ערך ההחזרה הוא אפס, השיטה equalsIgnoreCase(String str)
תחזיר גם אמת. הבה נסתכל על דוגמה קטנה כדי להסביר את השיטות הבאות:
public class StringCompareToExample {
public static void main(String[] args) {
String str = "ABC";
System.out.println(str.compareTo("DEF"));
System.out.println(str.compareToIgnoreCase("abc"));
}
}
התוכנית תוציא את הדברים הבאים:
-3
0
8. איך ממירים מחרוזת לתו ולהיפך?
זוהי שאלת טריק מכיוון שמחרוזת היא רצף של תווים, כך שאנו יכולים להמיר אותה רק לתו בודד. אנחנו יכולים להשתמש בשיטהcharAt
כדי למצוא את התו במיקום מסוים או שאנחנו יכולים להשתמש בשיטה toCharArray()
כדי להמיר מחרוזת למערך של תווים. דוגמה פשוטה המראה כיצד להמיר מחרוזת לתו ותו למחרוזת ב-Java.
import java.util.Arrays;
public class StringToCharToString {
public static void main(String[] args) {
//String to char array
String str = "123";
char[] chArr = str.toCharArray();
System.out.println("String to char array: "+Arrays.toString(chArr));
//String to char
char c = str.charAt(1);
System.out.println("String to char: "+c);
//char to String
String s = Character.toString(c);
System.out.println("char to String: "+s);
//удалить все заданные символы из строки
System.out.println("removing all chars from String: "
+removeCharFromString("1ABCD12DW", '1'));
}
private static String removeCharFromString(String str, char c) {
return str.replaceAll(Character.toString( c ), "");
}
}
התוכנית תוציא את הדברים הבאים:
String to char array: [1, 2, 3]
String to char: 2
char to String: 2
removing all chars from String: ABCD2DW
9. איך ממירים מחרוזת למערך בתים ולהיפך?
אנחנו יכולים להשתמש בשיטהgetBytes()
כדי להמיר מחרוזת למערך בתים ואנחנו יכולים להשתמש בבנאי new String(byte[] arr)
כדי להמיר מערך בתים למחרוזת.
import java.util.Arrays;
public class StringByteArray {
public static void main(String[] args) {
String str = "www.journaldev.com";
//преобразование String в byte array
byte[] byteArr = str.getBytes();
System.out.println("String to byte array : "+Arrays.toString(byteArr));
//преобразование byte array и String
String str1 = new String(byteArr);
System.out.println("byte array to String : "+str1);
//посмотрим, str и str1 одинаковые or нет
System.out.println("str == str1? " + (str == str1));
System.out.println("str.equals(str1)? " + (str.equals(str1)));
}
}
התוכנית תוציא את הדברים הבאים:
String to byte array : [119, 119, 119, 46, 106, 111, 117, 114, 110, 97, 108, 100, 101, 118, 46, 99, 111, 109]
byte array to String : www.journaldev.com
str == str1? false
str.equals(str1)? true
10. האם נוכל להשתמש במחרוזת במבנה מתג?
השאלה המסובכת הזו משמשת לבדיקת הידע שלך על ההתפתחות הנוכחית של השפה. Java 7 מרחיב את הצהרת המתג לשימוש במחרוזות; גרסאות קודמות של Java אינן תומכות בכך. אם אתה מיישם זרימה מותנית עבור מחרוזות, אתה יכול להשתמש בתנאי if-else ותוכל להשתמש במשפט switch אם אתה משתמש ב-Java 7 ואילך. דוגמה קטנה לשימוש במחרוזת במשפטswitch
ושיטה נוספת המציגה את אותו היגיון באמצעות תנאים if-else
.
public class SwitchStringExample {
public static void main(String[] args) {
printColorUsingSwitch("red");
printColorUsingIf("red");
// оператор switch регистрозависимый
printColorUsingSwitch("RED");
printColorUsingSwitch(null);
}
private static void printColorUsingIf(String color) {
if (color.equals("blue")) {
System.out.println("BLUE");
} else if (color.equals("red")) {
System.out.println("RED");
} else {
System.out.println("INVALID COLOR CODE");
}
}
private static void printColorUsingSwitch(String color) {
switch (color) {
case "blue":
System.out.println("BLUE");
break;
case "red":
System.out.println("RED");
break;
default:
System.out.println("INVALID COLOR CODE");
}
}
}
התוכנית תוציא את הדברים הבאים:
RED
RED
INVALID COLOR CODE
Exception in thread "main"
java.lang.NullPointerException
at com.journaldev.util.SwitchStringExample.printColorUsingSwitch(SwitchStringExample.java:24)
at com.journaldev.util.SwitchStringExample.main(SwitchStringExample.java:10)
נקודות שימוש מרכזיות switch
עבור מחרוזות ב-Java.
- השימוש במחרוזות בעיצוב
switch
הופך את הקוד לקריאה יותר על ידי ביטול שרשראות מרובות של תנאיםif-else
. - המחרוזות ב- הן
switch
תלויות רישיות, הדוגמה שלמעלה מראה זאת. - האופרטור
switch
משתמש בשיטהString.equals()
כדי להשוות את הערך המתקבל עם ערכי מקרה , אז הוסף סימון של NULL כדי להימנעNullPointerException
. - על פי תיעוד Java 7 עבור מחרוזות
switch
, מהדר Java מייצר קוד בתים יעיל יותר עבור מחרוזות במבנהswitch
מאשר עבור תנאים משורשריםif-else
. - ודא שזה ישמש עם Java 7 ואילך, אחרת תקבל
xception
.
11. כתוב תוכנית שמדפיסה את כל התמורות של מחרוזת.
זו שאלה מסובכת ועלינו להשתמש ברקורסיה כדי למצוא את כל התמורות של מחרוזת, למשל התמורות של "AAB" יכולות להיות "AAB", "ABA" ו-"BAA". אנחנו צריכים גם להשתמש ב-Set כדי לוודא שאין לנו שורות כפולות. כדי לקבל את כל התמורות, ניקח תחילה את התו הראשון של המחרוזת ונסדר מחדש את שאר התווים. אם מחרוזת = "ABC" תו ראשון char = A ושאר התמורות BC ו-CB. כעת נוכל להכניס את התו הראשון למיקומים הזמינים בתמורות. BC -> ABC, BAC, BCA CB -> ACB, CAB, CBA תוכנית לדוגמה:import java.util.HashSet;
import java.util.Set;
public class StringHelper {
public static Set<String> permutationFinder(String str) {
Set<String> perm = new HashSet<String>();
//Handling error scenarios
if (str == null) {
return null;
} else if (str.length() == 0) {
perm.add("");
return perm;
}
char initial = str.charAt(0); // первый символ
String rem = str.substring(1); // полная строка без первого символа
Set<String> words = permutationFinder(rem);
for (String strNew : words) {
for (int i = 0;i<=strNew.length();i++){
perm.add(charInsert(strNew, initial, i));
}
}
return perm;
}
public static String charInsert(String str, char c, int j) {
String begin = str.substring(0, j);
String end = str.substring(j);
return begin + c + end;
}
public static void main(String[] args) {
String s = "AAC";
String s1 = "ABC";
String s2 = "ABCD";
System.out.println("\nPermutations for " + s + " are: \n" + permutationFinder(s));
System.out.println("\nPermutations for " + s1 + " are: \n" + permutationFinder(s1));
System.out.println("\nPermutations for " + s2 + " are: \n" + permutationFinder(s2));
}
}
פלט תוכנית:
Permutations for AAC are:
[AAC, ACA, CAA]
Permutations for ABC are:
[ACB, ABC, BCA, CBA, CAB, BAC]
Permutations for ABCD are:
[DABC, CADB, BCAD, DBAC, BACD, ABCD, ABDC, DCBA, ADBC, ADCB, CBDA, CBAD, DACB, ACBD, CDBA, CDAB, DCAB, ACDB, DBCA, BDAC, CABD, BADC, BCDA, BDCA]
המשך המאמר
GO TO FULL VERSION