JavaRush/Java блог/Random UA/Java String. Питання до співбесіди та відповіді на них, ч...
Andrey
26 рівень

Java String. Питання до співбесіди та відповіді на них, ч.1

Стаття з групи Random UA
учасників
Клас Stringодин з найбільш широко використовуваних класів Java. У статті наведено деякі важливі питання до співбесіди з Java String та відповіді на них. Java String.  Питання до співбесіди та відповіді на них, ч.1 - 1Вони будуть дуже корисними для отримання повного уявлення про клас Stringі підготують до будь-якого питання, що стосується класу Stringна співбесіді.

1. Що таке String у Java? Який тип даних?

String - це клас Java, який прописаний в пакеті java.lang. Не примітивний тип даних, як int і long. Клас String представляє рядковий набір символів. Рядки використовуються практично по всіх Java-додатках, і є кілька фактів, які ми повинні знати про клас String. Це незмінний ( immutable) і фіналізований тип даних Java і всі об'єкти класу Stringвіртуальна машина зберігає в пулі рядків. Ще однією особливістю Stringє спосіб отримання об'єктів класу String, використовуючи подвійні лапки та перевантажуючи оператор “+” для конкатенації.

2. Які є способи створення об'єкта String?

Ми можемо створювати об'єкти використовуючи оператор new, як і для будь-якого іншого класу Java або ми можемо використовувати подвійні лапки для створення об'єкта String. Також є кілька конструкторів класу Stringдля отримання рядка з масиву символів, масиву байтів, а також використовуючи StringBufferабо StringBuilder.
String str = new String("abc");
String str1 = "abc";
Коли ми створюємо рядок, використовуючи подвійні лапки, віртуальна машина Java шукає в пулі рядків інший рядок з таким же значенням. Якщо рядок знайдено, то повертається тільки посилання на існуючий об'єкт класу String, інакше створюється новий об'єкт з отриманим значенням і зберігається в пул. Коли ми використовуємо оператор new, віртуальна машина створює об'єкт 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, і якщо рядок слідує за отриманим аргументом, то повертає позитивне значення integer. Якщо метод повертає 0, то рядок має те саме значення, в такому випадку метод equals(String str)так само поверне true. compareToIgnoreCase(String str): цей метод подібний до попереднього, за винятком того, що він ігнорує регістр символів. Він використовує CASE_INSENSITIVE_ORDER Comparator для регістронезалежного порівняння. Якщо значення, що повертається, дорівнює нулю, тоді методequalsIgnoreCase(String str)так само поверне true. Давайте розглянемо невеликий приклад, який пояснює ці методи:
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 одинаковые або нет
        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. Чи можемо ми використовувати рядок у конструкції switch.

Це хитре питання, що використовується для перевірки ваших знань про поточний розвиток мови. Java 7 розширює можливості оператора switch для використання рядків, ранні версії 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()для порівняння отриманого значення зі значеннями case , тому додайте перевірку на NULL щоб уникнути NullPointerException.
  • згідно з документацією Java 7 для рядків switch, компілятор Java формує більш ефективний байткод для рядків у конструкції switch, ніж для зчеплених умов if-else.
  • переконайтеся, що це буде використовуватися з Java 7 або пізнішою версією, інакше отримаєте xception.

11. Напишіть програму, яка друкує всі перестановки рядка.

Це непросте питання, і ми повинні використовувати рекурсію для знаходження всіх перестановок рядка, наприклад, перестановками "AAB" можуть бути "AAB", "ABA" і "BAA". Також нам необхідно використовувати Set для того, щоб переконатися, що ми не маємо дублікатів рядків. Для отримання всіх перестановок, ми для початку беремо перший символ рядка і переставляємо символи, що залишабося. Якщо String = “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]
Продовження статті
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.