1. Будова класу String

Сьогодні розмова піде про клас String. Клас String — найпопулярніший клас у Java після типу int. Він використовується скрізь і має купу корисних методів, які варто знати.

Клас String — це єдиний клас, крім примітивних типів, літерали якого можна використовувати в операторах switch; компілятор в особливий спосіб обробляє додавання рядків і об'єктів; об'єкти String в особливий спосіб зберігаються в пам'яті. Клас String — дійсно особливий клас.

Крім того, клас String має купу класів-сателітів, які спрощують роботу з рядками в Java. Коли ви все це вивчите, ви зможете легко робити багато речей. Ну а почнемо ми з найголовнішого — з будови класу String.

Масив символів

Клас String насправді влаштований дуже просто: він містить масив символів (char), де зберігаються всі символи рядка. Отак, наприклад, зберігається слово «Привіт»:

Важливо!

Насправді все так, але трохи не так. Оскільки клас String дуже важливий, у ньому використовується дуже багато оптимізацій, і дані в ньому зберігаються не у вигляді масиву символів, а просто у вигляді масиву байтів.


2. Методи класу String

Клас String має дуже багато методів: самих лише конструкторів 18 штук! Тому ми наведемо тільки найважливіші методи.

Методи Опис
int length()
Повертає кількість символів у рядку
boolean isEmpty()
Перевіряє, чи рядок є порожнім
boolean isBlank()
Перевіряє, чи рядок містить тільки пробіли або керівні символи (tab, enter тощо)
char charAt(int index)
Повертає символ, який знаходиться в рядку на позиці з номером index
char[] toCharArray()
Повертає масив символів (копію), з яких складається рядок
byte[] getBytes()
Перетворює рядок на набір байтів і повертає масив байтів
String[] split(String regex)
Розділяє рядок на кілька підрядків
String join(CharSequence delimiter, elements)
Склеює в один рядок кілька підрядків
String intern()
Поміщає рядок у пул StringPool

Докладну інформацію про конструктори див. у статті «Навіщо потрібен конструктор?»

Спробуймо написати програму, що перетворює шлях до файлу у форматі ОС Unix на формат, який використовується в ОС Windows. В ОС Unix роздільником директорій є символ /, а в ОС Windows — символ \.

Спосіб 1 — використання масиву символів (char)

Код Примітки
Scanner console = new Scanner(System.in);
String path = console.nextLine();

char[] chars = path.toCharArray();
for (int i = 0; i < chars.length; i++)
   if (chars[i] == '/')
      chars[i] = '\\';

String result = new String(chars);
System.out.println(result);
Створення об'єкта Scanner
Читання рядка з консолі

Перетворення рядка на масив символів
Цикл по символах
Якщо символ дорівнює /,
замінити його на \. Не забуваємо про екранування.

Створюємо новий рядок на основі масиву символів.
Виводимо рядок на екран.

Спосіб 2 — використання методів split() і join():

Код Примітки
Scanner console = new Scanner(System.in);
String path = console.nextLine();

String[] array = path.split("/");


String result = String.join("\\", array);


System.out.println(result);
Створення об'єкта Scanner
Читання рядка з консолі

Перетворення рядка на масив рядків. Як роздільник використовується символ / (дві додаткові скісні риски — це результат подвійного екранування).
Об'єднуємо всі рядки з масиву рядків; як роздільник використовується символ \ (ми бачимо його екранованим).

Виводимо рядок на екран.

Спосіб 3 — використання методу replace(char oldChar, char newChar):

Код Примітки
Scanner console = new Scanner(System.in);
String path = console.nextLine();

String result = path.replace('/', '\\');

System.out.println(result);
Створення об'єкта Scanner
Читання рядка з консолі

Просто замінюємо один символ на другий
(другий символ екрановано)
Виводимо рядок на екран.