Перейти к содержимому
Теория · Строки · урок 1 из 11

Строки и их методы

Чему вы научитесь

Чему вы научитесь:

  • читать строку по позициям и вырезать из неё часть методами charAt и substring;
  • объяснять, почему метод строки не меняет её, а возвращает новую;
  • сравнивать строки через equals и объяснять, когда == даёт true;
  • собирать строку в цикле через StringBuilder и обращаться с символами char как с числами.

Представьте напечатанную карточку с текстом. Буквы стоят на ней в ряд, каждая в своей клетке, а у клеток есть номера. С карточкой можно делать многое: посчитать клетки, прочитать букву в любой из них, найти слово. Одного сделать нельзя — стереть или исправить букву: карточка напечатана.

Строка в Java — такая карточка. Текст хранят в переменной типа String: String name = "Anna";. Программы работают с текстом постоянно: имена, сообщения, команды. Часто текст нужно не только напечатать, но и разобрать: узнать длину, взять первую букву, найти слово, вырезать кусок. Для этого у строки есть свои методы:

JAVA
public class Main {
    public static void main(String[] args) {
        String word = "Java";
        System.out.println(word.length());  // 4
        System.out.println(word.charAt(0)); // J
        System.out.println(word.charAt(3)); // a
    }
}

Давайте разберём программу по строкам:

  1. String word = "Java"; кладёт в переменную word строку из четырёх символов.
  2. word.length() возвращает длину строки — 4.
  3. word.charAt(0) возвращает символ в клетке с номером 0 — J.
  4. word.charAt(3) возвращает символ в последней клетке — a.

Методы строки

String — класс, а каждая строка — его объект. Как и массив, строку JVM создаёт в куче, но у строки есть ещё и свои методы — действия, которые она умеет выполнять. Их вызывают через точку после самой строки: word.length(). Такой метод работает с той строкой, у которой его вызвали, — с word, а не с какой-то другой.

Скобки после имени метода нужны всегда, даже пустые: это вызов, как square(3).

Номера символов

Номер клетки — это индекс символа. Как и в массиве, индексы считают с нуля:

  • у первого символа индекс 0;
  • у последнего — length() - 1, у "Java" это 3;
  • индекс за концом строки, например word.charAt(4), останавливает программу с исключением StringIndexOutOfBoundsException.

charAt возвращает не строку, а один символ — значение типа char.

Часть строки: substring

Подстрока — кусок строки, который идёт подряд. Метод substring(begin, end) возвращает подстроку от индекса begin до индекса end:

JAVA
String text = "Hello, Java";
System.out.println(text.substring(7, 11)); // Java
System.out.println(text.substring(0, 5));  // Hello
System.out.println(text.substring(7));     // Java

Правила substring такие:

  • символ с индексом begin входит в результат;
  • символ с индексом end не входит: подстрока заканчивается перед ним;
  • поэтому в результате end - begin символов: substring(0, 5) даёт пять символов Hello;
  • с одним аргументом, substring(7), метод берёт всё от индекса 7 до конца строки.

Зачем конец не включать? Так строку удобно делить: substring(0, 5) и substring(5, 11) разрезают "Hello, Java" на две части без пропусков и повторов. На собеседовании любят спросить, что вернёт substring с двумя аргументами, и проверить, помните ли вы про невключённый конец.

Здесь картинка с карточкой неточна. Настоящую карточку можно разрезать ножницами, и в руках останется кусок. substring карточку не режет: он создаёт новую строку с нужными символами, а text остаётся целой.

Поиск и новые строки

Ещё несколько методов, которые нужны почти в каждой программе:

JAVA
String raw = "  Hi, Bob ";
String clean = raw.strip();
System.out.println("[" + clean + "]");           // [Hi, Bob]
System.out.println(clean.indexOf("Bob"));        // 4
System.out.println(clean.indexOf("Ann"));        // -1
System.out.println(clean.contains("Hi"));        // true
System.out.println(clean.toUpperCase());         // HI, BOB
System.out.println(clean.replace("Bob", "Ann")); // Hi, Ann
System.out.println("   ".isBlank());             // true

Разберём их по порядку:

  1. strip() убирает пробелы в начале и в конце строки. Квадратные скобки при печати показывают, что пробелов не осталось.
  2. indexOf("Bob") ищет подстроку и возвращает индекс, с которого она начинается, — 4. Если подстроки нет, он возвращает -1.
  3. contains("Hi") отвечает true или false: есть ли в строке такая подстрока.
  4. toUpperCase() возвращает строку из заглавных букв, а toLowerCase() — из строчных.
  5. replace("Bob", "Ann") заменяет каждое вхождение первой подстроки на вторую.
  6. isBlank() даёт true, если в строке нет ничего, кроме пробелов. Для пустой строки "" он тоже даёт true.

Частая ошибка

Длину строки запросили без скобок:

JAVA
String word = "Java";
int n = word.length; // ✗
TEXT
error: cannot find symbol

Программа не компилируется. У массива длину читают без скобок, a.length, а у строки длина — это метод length(), и скобки обязательны. Компилятор ищет у строки length без скобок, не находит и сообщает, что такого имени нет. Пишите word.length().

Главное

  • Методы строки вызывают через точку: word.length(), word.charAt(0); скобки нужны всегда.
  • Индексы символов идут с нуля, у последнего символа индекс length() - 1.
  • substring(begin, end) включает begin и не включает end, поэтому в результате end - begin символов.
  • indexOf возвращает индекс начала подстроки или -1, если её нет.