Методы строк Java
Справочник по методам строк Java: length, charAt, substring, indexOf, replace, split, toUpperCase, trim и другие.
Класс String содержит десятки методов. Эта глава — рабочий справочник по тем, которые вы будете использовать на практике. Методы сгруппированы по назначению: инспекция, сравнение, поиск, разбиение, преобразование, разделение/объединение, конвертация и форматирование.
Помните: строки неизменяемы. Каждый метод ниже возвращает новую строку (или другое значение) — он никогда не изменяет строку, на которой был вызван. Это означает, что вызов s.toUpperCase(); сам по себе ничего полезного не делает; необходимо сохранить результат:
String s = "hello";
s.toUpperCase(); // result discarded — s is still "hello"
s = s.toUpperCase(); // s is now "HELLO"Индексы отсчитываются с нуля и считают кодовые единицы UTF-16, а не воспринимаемые пользователем символы, что важно для эмодзи и других дополнительных символов.
Инспекция строки
| Метод | Что возвращает |
|---|---|
length() | количество кодовых единиц UTF-16 |
isEmpty() | true, если длина равна 0 |
isBlank() (Java 11+) | true, если длина равна 0 или строка содержит только пробельные символы |
charAt(int i) | символ по индексу i |
codePointAt(int i) | кодовая точка Unicode по индексу i |
"hello".length(); // 5
"".isEmpty(); // true
" ".isBlank(); // true
"hello".charAt(1); // 'e'Сравнение строк
| Метод | Что возвращает |
|---|---|
equals(other) | true, если содержимое одинаково |
equalsIgnoreCase(other) | равенство без учёта регистра |
compareTo(other) | отрицательное / 0 / положительное число для лексикографического порядка |
compareToIgnoreCase(other) | то же, без учёта регистра |
"hi".equals("hi"); // true
"HI".equalsIgnoreCase("hi"); // true
"apple".compareTo("banana"); // negativeВсегда предпочитайте .equals() оператору == для сравнения содержимого (Операторы сравнения). Оператор == сравнивает ссылки на объекты — указывают ли две переменные на один и тот же объект, — а не символы внутри строки. Поскольку Java интернирует строковые литералы, == иногда работает, но перестаёт работать в момент, когда строка создаётся во время выполнения:
String a = "hi";
String b = "hi";
String c = new String("hi");
a == b; // true — both point to the same interned literal
a == c; // false — c is a different object
a.equals(c); // true — same contentscompareTo следует использовать для сортировки: он возвращает отрицательное число, ноль или положительное число, что позволяет напрямую применять его в Collections.sort или цепочках Comparator.
Поиск
| Метод | Что возвращает |
|---|---|
contains(seq) | true, если seq встречается где-либо |
indexOf(seq) | первый индекс начала seq или -1 |
indexOf(seq, fromIndex) | то же, начиная с fromIndex |
lastIndexOf(seq) | последний индекс начала seq или -1 |
startsWith(prefix) | true, если строка начинается с prefix |
endsWith(suffix) | true, если строка заканчивается на suffix |
String s = "abc-xyz-abc";
s.contains("xyz"); // true
s.indexOf("abc"); // 0
s.lastIndexOf("abc"); // 8
s.startsWith("abc"); // true
s.endsWith("xyz"); // falseРазбиение на подстроки
| Метод | Что возвращает |
|---|---|
substring(start) | от индекса start до конца |
substring(start, end) | от start (включительно) до end (не включая) |
String s = "Hello, World!";
s.substring(7); // "World!"
s.substring(7, 12); // "World"Отрицательные индексы не допускаются — они вызывают StringIndexOutOfBoundsException.
Преобразование
| Метод | Что возвращает |
|---|---|
toUpperCase() | копия в верхнем регистре |
toLowerCase() | копия в нижнем регистре |
trim() | копия без ведущих/завершающих ASCII-пробельных символов |
strip() (Java 11+) | копия без ведущих/завершающих Unicode-пробельных символов |
replace(old, new) | замена каждого точного совпадения |
replaceAll(regex, replacement) | замена на основе регулярного выражения |
replaceFirst(regex, replacement) | регулярное выражение, только первое совпадение |
repeat(n) (Java 11+) | строка, повторённая n раз |
concat(other) | идентично s + other |
" hello ".strip(); // "hello"
"banana".replace("a", "_"); // "b_n_n_"
"hello".repeat(3); // "hellohellohello"
"abc 123".replaceAll("\\d", "*"); // "abc ***"Разделение и объединение
| Метод | Что возвращает |
|---|---|
split(regex) | массив подстрок |
split(regex, limit) | то же, но ограниченное limit частями |
String.join(sep, parts...) | статический метод — объединяет с разделителем |
chars() | IntStream кодовых единиц UTF-16 |
lines() (Java 11+) | Stream<String> строк |
"a,b,c".split(","); // ["a","b","c"]
String.join("-", "a", "b", "c"); // "a-b-c"
String.join(",", List.of("a","b")); // "a,b"
"line1\nline2\nline3".lines().count(); // 3split принимает регулярное выражение, а не обычную строку — поэтому экранируйте метасимволы: используйте split("\\.") для разбиения по точке, а не split(".") (которое соответствует любому символу и возвращает пустой массив). Завершающие пустые строки по умолчанию отбрасываются; передайте отрицательное значение limit (например split(",", -1)), чтобы их сохранить.
Конвертация
| Метод | Что возвращает |
|---|---|
toCharArray() | char[] символов строки |
getBytes() | массив байтов в UTF-8 (или кодировке платформы, в зависимости от перегрузки) |
String.valueOf(any) | статический — преобразует любое значение в строку |
Integer.parseInt(s) | разбирает строку в int |
Double.parseDouble(s) | разбирает строку в double |
Boolean.parseBoolean(s) | разбирает строку в boolean |
String.valueOf(42); // "42"
Integer.parseInt("42"); // 42
Double.parseDouble("3.14"); // 3.14
"hello".toCharArray(); // {'h','e','l','l','o'}Методы parse* выбрасывают NumberFormatException, если текст не является допустимым числом, поэтому оборачивайте пользовательский ввод в блок try/catch или проверяйте его заранее. В отличие от parseInt, вызов String.valueOf(null) безопасен — он возвращает строку "null", а не выбрасывает исключение.
Форматирование
| Метод | Что возвращает |
|---|---|
String.format(fmt, args...) | статический — строка в стиле printf |
formatted(args...) (Java 15+) | метод экземпляра, аналогичен format с this как fmt |
String.format("%s is %d", "Ada", 36); // "Ada is 36"
"%s is %d".formatted("Ada", 36); // "Ada is 36"Комплексная демонстрация
Что дальше
Конкатенация строк в Java подробно рассматривает +, concat и StringBuilder, включая выбор подходящего инструмента в каждом случае.