Menu

Строки в Java: создание, конкатенация и использование методов String

Как работают строки в Java: их создание, объединение через +, почему они неизменяемы, сравнение через equals и повседневные методы String, такие как length, substring и replace.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Что такое строка (String)

String содержит последовательность символов - текст, например имя, предложение или строку, прочитанную из файла. На предыдущей странице вы видели String среди ссылочных типов; здесь же вы будете работать с ней на практике. Строковый литерал записывается в двойных кавычках (одинарные кавычки зарезервированы для одного char):

name.length() возвращает количество символов - 3 для "Ada". Это вызов метода, поэтому ему нужны скобки.

Объединение строк

Оператор + склеивает строки между собой. Если хотя бы одна из сторон + является строкой, другая сторона автоматически преобразуется в текст, поэтому вы можете без лишних усилий подмешивать числа и логические значения:

Одна тонкость: поскольку + вычисляется слева направо, "" + 1 + 2 даёт "12" (строка + int, затем строка + int), а 1 + 2 + "" даёт "3" (сначала складываются два целых числа, а потом результат превращается в текст). Если сомневаетесь, заключайте арифметику в скобки.

Строки неизменяемы

Это самое важное, что нужно понять о строках в Java: String никогда не меняется после создания. Каждый метод, который «изменяет» строку, на самом деле возвращает совершенно новую строку и оставляет исходную нетронутой. Поэтому, если вы забудете сохранить возвращаемое значение, ничего не произойдёт:

Первый вызов вычисляет "HELLO" и тут же отбрасывает его. Видимый эффект даёт только вторая строка, в которой результат присваивается обратно в s. На этом хоть раз спотыкается почти каждый.

Сравнение строк

Используйте .equals(), чтобы сравнить содержимое двух строк. Тянуться к == - классическая ошибка новичка: == спрашивает «это один и тот же объект в памяти?», а не «содержат ли они одинаковый текст?»:

Здесь a == b равно false, потому что new String(...) создаёт отдельный объект. Всегда сравнивайте значения строк через .equals() (или .equalsIgnoreCase(), чтобы игнорировать регистр). Удобный приём, чтобы избежать сбоя, когда одна из сторон может быть null, - вызывать .equals на литерале: "yes".equals(input) никогда не выбросит исключение, даже если input равно null.

Повседневные методы String

Поскольку строки неизменяемы, каждый из этих методов возвращает новую строку (или значение), а не изменяет исходную. Вот те, к которым вы будете обращаться постоянно:

Обратите внимание на цепочку вызовов: s.trim().toUpperCase() работает, потому что trim() возвращает строку, на которой вы затем вызываете toUpperCase(). substring - ещё один рабочий инструмент: он принимает начальный индекс (включительно) и необязательный конечный индекс (исключительно):

Индексы начинаются с нуля, поэтому substring(0, 4) берёт символы с 0 по 3. Запрос индекса за пределами конца строки выбрасывает StringIndexOutOfBoundsException.

Построение строк в цикле

Конкатенация через + подходит для нескольких частей, но делать это внутри большого цикла медленно - каждый + создаёт новую строку и копирует всё целиком. Когда вы собираете текст в цикле, используйте StringBuilder, который изменяет буфер на месте и формирует итоговую строку только один раз в конце:

append возвращает тот же builder, поэтому вызовы можно объединять в цепочку. В конце вызовите .toString(), чтобы получить обычный String. Для разовых объединений придерживайтесь +; для накопления множества частей StringBuilder - правильный инструмент.

Далее: Форматирование строк

Конкатенация становится громоздкой, как только вам нужны выровненные столбцы, фиксированное число знаков после запятой или числа с дополнением (padding). Методы Java String.format и printf используют шаблон с заполнителями %, чтобы аккуратно справиться со всем этим - это тема следующей страницы.

Часто задаваемые вопросы

Как сравнить две строки в Java?

Используйте .equals() для сравнения содержимого: a.equals(b) возвращает true, когда символы совпадают. Не используйте == для сравнения значений строк - == сравнивает ссылки на объекты, поэтому может вернуть false для двух строк с одинаковым текстом. Используйте .equalsIgnoreCase(), когда регистр не должен иметь значения.

Почему строки в Java неизменяемы (immutable)?

После создания объект String уже никогда не может измениться. Методы вроде replace или toUpperCase возвращают новую строку, а не изменяют исходную. Неизменяемость делает строки безопасными для совместного использования и кэширования, но это означает, что результат нужно присвоить: s = s.toUpperCase();. Если вы вызываете метод и игнорируете его возвращаемое значение, ничего не происходит.

Как узнать длину строки в Java?

Вызовите метод .length(): "hello".length() возвращает 5. Обратите внимание, что у String это метод со скобками, в отличие от массивов, где length - это поле без скобок (arr.length).

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ