Клас
String
один з найбільш широко використовуваних класів Java. У статті наведено деякі важливі питання до співбесіди з Java String та відповіді на них. Вони будуть дуже корисними для отримання повного уявлення про клас 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]
Продовження статті
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ