JavaRush /בלוג Java /Random-HE /מחרוזת ג'אווה. שאלות ותשובות לראיון, חלק 1
Andrey
רָמָה

מחרוזת ג'אווה. שאלות ותשובות לראיון, חלק 1

פורסם בקבוצה
המחלקה Stringהיא אחת השיעורים הנפוצים ביותר בג'אווה. מאמר זה מספק כמה שאלות ותשובות חשובות לראיונות Java String. מחרוזת ג'אווה.  שאלות ותשובות לראיון, חלק 1 - 1הם יעזרו מאוד לקבל תמונה מלאה של הכיתה 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]
המשך המאמר
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION