JavaRush /Курси /Java Syntax Zero /Пристрій класу String

Пристрій класу String

Java Syntax Zero
Рівень 10 , Лекція 4
Відкрита

1. Пристрій класу String

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

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

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

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

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

Пристрій класу String
Важливо!

Насправді все трохи не так. Оскільки клас 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 Style у Windows Style. 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
Читання рядка з консолі

Просто замінюємо один символ на інший
(другий — екранований)
Виводимо рядок на екран.
Коментарі (7)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
IronMan57 Рівень 28
7 грудня 2024
Зверніть увагу, що в методі split параметром виступає не звичайний рядок, а рядок, що представляє собою так названий "регулярний вираз". Не знаючи цього, в задачі до слідуючої лекції я намагався розбити рядок використовуючи слідуючу команду:

String[] urlElements = url.split(".");
і отримував замість масиву рядків пустий масив. Як виявилось, причина була в тому, що в регулярних виразах символ крапки означає любий символ. Тому, якщо потрібно розбити один рядок на підрядки з крапкою в якості роздільника, то крапку в аргументі методу split потрібно екранувати, причому подвійним зворотнім слешем. Наприклад, таким чином:

String[] urlElements = url.split("\\.");
Anonymous #3425794 Рівень 11
24 січня 2025
Яка чудове спостереження, дуже тобі дякую!
Гаркін Рівень 14
31 березня 2024
Фраза "Клас String — це єдиний клас, крім примітивних типів, літерали якого можна використовувати в операторах switch" мені сподобалась. Ось тільки одне запитання - коли ми проходили оператори switch?!
Ростислав Рівень 32
5 листопада 2024
теж саме подумав)
Yevhenii Рівень 17
28 січня 2023
Третій спосіб самий зрозумілий, також його запам'ятати найлегше
Харченко Иван Рівень 15
5 лютого 2022
Як на мене - останній 3-й спосіб найзручніший
Roma Chernesh Рівень 16
30 грудня 2022
Та ото зрозуміло) Думається мені, що нам показують різні способи для того, щоб нас привчити тримати в голові різні способи вирішення завдання. Бо не завжди пам'ятаєш "який там я колись бачив дуже зручний метод", а до голови приходять згадки лише чогось некрасивого, але працюючого.