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

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

Открыта

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
Чтение строки с консоли

Просто заменяем один символ на второй
(второй — экранирован)
Выводим строку на экран.
Комментарии (216)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Euraks Backend Developer
25 сентября, 18:05
🦔
ʟᴏɴᴇʟʏ ʟʏɴx
Уровень 49
14 июня, 10:33
Можно пожалуйста лайк на ачивку? Буду очень благодарна!
fearwork
Уровень 14
19 апреля, 10:17
ребята поставьте лайк пожалуйста для очивки заранее спасибо!!
Dmitry Java Developer
15 апреля, 17:57
Размышления про себя Решение1: ну в целом понятно и логично, скачем по символам и через ифы меняем Решение2: в примечаниях не понял работу ни джоина ни сплита, скипнул решение Решение3: оказывается есть метод риплейс, который почти начисто исключает использование двух предыдущих решений Это похоже на следующее: Чтобы закрутить гайку м8: Решение1: возьмите два ключа рожковых на 8 и на 16, ключ на 16 подставляем к гайке и в распор обратной стороной вставляем ключ на 8, далее с усилием жмем ключи в разные стороны для постоянного давления и исключения срыва шлицов гайки, откручиваем до результата Решение2: откройте кейс с инструментами, возьмите трещетку и головку на 12, открутите гайку.
C0N5P1RACY QA Automation Engineer
9 декабря 2025, 09:47
класс `String` -- это очень специфичный класс. А устроен класс `String` на самом деле очень просто... На самом деле все немного не так...
Grigoryvvv
Уровень 28
Expert
10 ноября 2025, 18:18
10.11.2025 / 10 уровень
Artur
Уровень 14
5 ноября 2025, 12:49
Читаешь вникаешь , тут - НА САМОМ ДЕЛЕ ВСЕ НЕ ТАК. Хочется монитор разбить тому кто писал !
Artur
Уровень 14
5 ноября 2025, 12:46
это ужас : 1 .В общем, класс String — это очень специфический класс. 2 . А устроен класс String на самом деле очень просто: внутри него находится массив символов (char), 3.На самом деле все немного не так. Т.к. класс String очень важен, в нем используется очень много оптимизаций, и данные хранятся внутри не в виде массива символов, а просто в виде массива байтов. ЄТО КТО ТАК ОБЯСНЯЕТ ????? просто бред . как будто специально цель запутать ! ( это не тяжелая тема ) Но такое пояснение это трешь... ГПТ лучше обясняет !
Vadim
Уровень 5
27 августа 2025, 12:37
Дойдя до этого уровня я вывел девиз JavaRush : лучше знать, чем не знать.
Gris Hiver
Уровень 1
11 августа 2025, 12:39
Маловато мне теории на JavaRush. Открыла первую попавшуюся книжку по Java и сразу получила понятное для меня объяснение:
В Java все объекты программы расположены в динамической памяти — куче
данных (heap) — и доступны по объектным ссылкам, которые хранятся в стеке
(stack). Это решение исключило непосредственный доступ к памяти, но усложнило
работу с элементами массивов и сделало ее менее эффективной по сравнению с про-
граммами на C++.
Anton Zorin
Уровень 32
20 августа 2025, 05:30
Можно накинуть 3тим пунктом. Metaspace (Пришла на смену PermGen) — Java 8+ Для чего: Теперь хранит метаданныe класса (байт-код, имена методов и т.д.). Где находится: В Native Memory (памяти операционной системы), а не в памяти JVM. Это значит, что ее размер ограничен только ресурсами самой ОС. Управление: JVM автоматически увеличивает Metaspace по мере необходимости. Можно задать максимальный лимит (-XX:MaxMetaspaceSize). Преимущество: По умолчанию у Metaspace нет фиксированного верхнего предела, поэтому ошибка OutOfMemoryError: PermGen space ушла в прошлое. Теперь при исчерпании места возникает java.lang.OutOfMemoryError: Metaspace.