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

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

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

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()
Проверяет, что в строке — только 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
Чтение строки с консоли

Просто заменяем один символ на второй
(второй — экранирован)
Выводим строку на экран.
Комментарии (218)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
ʟᴏɴᴇʟʏ ʟʏɴx Уровень 22
14 июня 2026
Можно пожалуйста лайк на ачивку? Буду очень благодарна!
fearwork Уровень 14
19 апреля 2026
ребята поставьте лайк пожалуйста для очивки заранее спасибо!!
Dmitry Уровень 11
15 апреля 2026
Размышления про себя Решение1: ну в целом понятно и логично, скачем по символам и через ифы меняем Решение2: в примечаниях не понял работу ни джоина ни сплита, скипнул решение Решение3: оказывается есть метод риплейс, который почти начисто исключает использование двух предыдущих решений Это похоже на следующее: Чтобы закрутить гайку м8: Решение1: возьмите два ключа рожковых на 8 и на 16, ключ на 16 подставляем к гайке и в распор обратной стороной вставляем ключ на 8, далее с усилием жмем ключи в разные стороны для постоянного давления и исключения срыва шлицов гайки, откручиваем до результата Решение2: откройте кейс с инструментами, возьмите трещетку и головку на 12, открутите гайку.
C0N5P1RACY Уровень 1
9 декабря 2025
класс `String` -- это очень специфичный класс. А устроен класс `String` на самом деле очень просто... На самом деле все немного не так...
Grigoryvvv Уровень 17 Expert
10 ноября 2025
10.11.2025 / 10 уровень
Artur Уровень 14
5 ноября 2025
Читаешь вникаешь , тут - НА САМОМ ДЕЛЕ ВСЕ НЕ ТАК. Хочется монитор разбить тому кто писал !
Artur Уровень 14
5 ноября 2025
это ужас : 1 .В общем, класс String — это очень специфический класс. 2 . А устроен класс String на самом деле очень просто: внутри него находится массив символов (char), 3.На самом деле все немного не так. Т.к. класс String очень важен, в нем используется очень много оптимизаций, и данные хранятся внутри не в виде массива символов, а просто в виде массива байтов. ЄТО КТО ТАК ОБЯСНЯЕТ ????? просто бред . как будто специально цель запутать ! ( это не тяжелая тема ) Но такое пояснение это трешь... ГПТ лучше обясняет !
Vadim Уровень 5
27 августа 2025
Дойдя до этого уровня я вывел девиз JavaRush : лучше знать, чем не знать.
Gris Hiver Уровень 1
11 августа 2025
Маловато мне теории на JavaRush. Открыла первую попавшуюся книжку по Java и сразу получила понятное для меня объяснение:

В Java все объекты программы расположены в динамической памяти — куче 
данных (heap) — и доступны по объектным ссылкам, которые хранятся в стеке 
(stack). Это решение исключило непосредственный доступ к памяти, но усложнило 
работу с элементами массивов и сделало ее менее эффективной по сравнению с про- 
граммами на C++.
Anton Zorin Уровень 26
20 августа 2025
Можно накинуть 3тим пунктом. Metaspace (Пришла на смену PermGen) — Java 8+ Для чего: Теперь хранит метаданныe класса (байт-код, имена методов и т.д.). Где находится: В Native Memory (памяти операционной системы), а не в памяти JVM. Это значит, что ее размер ограничен только ресурсами самой ОС. Управление: JVM автоматически увеличивает Metaspace по мере необходимости. Можно задать максимальный лимит (-XX:MaxMetaspaceSize). Преимущество: По умолчанию у Metaspace нет фиксированного верхнего предела, поэтому ошибка OutOfMemoryError: PermGen space ушла в прошлое. Теперь при исчерпании места возникает java.lang.OutOfMemoryError: Metaspace.
Anonymous #3585174 Уровень 33
18 июня 2025
like