JavaRush /Курсы /Java Syntax New Beta /Устройство класса String

Устройство класса String

Java Syntax New Beta
9 уровень , 4 лекция
Открыта

— Как считаешь, Амиго, какой самый популярный класс в Java после int?

— Ты мне уже проспойлерила в названии лекции, Элли. Это String!

— Спойлер спойлером, а так и есть. String используется абсолютно везде. У него есть куча полезных методов, которые лучше знать, чем не знать.

— Класс String — единственный класс, кроме примитивных типов, литералы которого можно использовать в switch; компилятор по-особому обрабатывает сложение строк и объектов; объекты String по-особому хранятся в памяти. В общем, класс String — это очень специфический класс.

— Также у класса String есть куча классов-сателлитов, цель которых — еще больше упростить работу со строками в Java. Когда ты всё это изучишь, тебе действительно станет значительно проще делать многие вещи.

— Жду не дождусь.

— Ну а начнем мы с самого сердца этой экосистемы — с устройства класса String. Устроен класс String на самом деле очень просто: внутри него находится массив символов (char), который хранит все символы строки. Вот так, например, хранится слово «Привет»:

Важно.

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

Методы класса String

У класса String очень много методов: одних только конструкторов у него 18 штук! Поэтому ниже я приведу только самые часто используемые:

Методы Описание
int length()
Возвращает количество символов в строке
boolean isEmpty()
Проверяет, что строка == пустая строка
boolean isBlank()
Проверяет, что в строке — только whitespace-символы: пробел, 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
Чтение строки с консоли

Просто заменяем один символ на второй
(второй — экранирован)
Выводим строку на экран.

— Мне больше всего понравилось третье решение. Но потренируюсь на всех трёх.

— Молодец, Амиго. Вижу, что тебе уже не терпится обкатать новые знания на практике. Урок окончен.

9
Задача
Java Syntax Pro, 9 уровень, 4 лекция
Недоступна
Обратный отсчет
В классе Solution в методе countDown() происходит обратный отсчет. Тебе нужно сделать так, чтобы между выводом текста в консоль была пауза в 1 секунду. В этом тебе поможет метод sleep(long) класса Thread.
9
Задача
Java Syntax Pro, 9 уровень, 4 лекция
Недоступна
Counter
В классе Solution реализуй метод printNumbers(), который выводит числа от 1 до 10 включительно с паузой между выводом каждого числа - 1,3 миллисекунды. В этом тебе поможет метод sleep(long, int) класса Thread.
9
Задача
Java Syntax Pro, 9 уровень, 4 лекция
Недоступна
Таймер
В классе Solution реализуй метод setTimer(int, int, int, int, int), который засыпает на определенное время, используя соответствующие методы java.util.concurrent.TimeUnit.
Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3283984 Уровень 24
30 апреля 2023
Мне тоже понравилось больше всего третье решение!
Larvixx Уровень 17
2 февраля 2023
В описании решения 2 опечатка ! " Объедением все строки из массива строк "
Nixis Уровень 10
15 декабря 2022
Возможно это ничего не меняет, но если заглянуть в документ Java API, то формально методы isEmpty() и is Blank() описаны неверно. Первый метод возвращает true, если длина строки равна 0, а не если она пуста, а второй как раз таки, если строка пуста, или если она содержит только Whitespace символы.
Ivan Уровень 7 Expert
8 ноября 2022
Ролевые игры с переодеванием девочки в мальчика обожежесть)))
NextGenSeafarer Уровень 1
4 мая 2022
Элли и Диего очень любят в переодевания я так понял) P.S. админы, фикс тут пожалуйста 🤖🤖🤖
Lafaed Уровень 36
30 октября 2022
- разрабы исправьте. - ни за что.
Shedar Уровень 28
5 ноября 2021
Что-то интересное :)
hidden #2523919 Уровень 13
2 мая 2021
В решении два: дополнительные два слеша – это следствие двойного экранирования Где они?
Nurbek Sandibekov Уровень 28
8 мая 2021
Нет там экранируется один бэк слеш : поэтому "\\", а для двойного бэк слеша : "\\\\" ; то есть для каждого символа который хочешь вывести на экран нужна подставить "свой" слеш. Например: "\\name\"blabla\+";
El amigo verde Уровень 19
4 февраля 2021
Решение 2. Что это за слово "Объедением"?
PERFORATTOR Уровень 19
31 октября 2021
Объедение у кого рот большой.
Anonymous #2402738 Уровень 16
25 августа 2020
Исправить "Чтение строки с консолиПреобразование строки в массив строк. "