W3docs

Методы строк 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 contents

compareTo следует использовать для сортировки: он возвращает отрицательное число, ноль или положительное число, что позволяет напрямую применять его в 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();  // 3

split принимает регулярное выражение, а не обычную строку — поэтому экранируйте метасимволы: используйте 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— editable, runs on the server

Что дальше

Конкатенация строк в Java подробно рассматривает +, concat и StringBuilder, включая выбор подходящего инструмента в каждом случае.

Практика

Практика
Какой метод возвращает true, если строка содержит только пробельные символы?
Какой метод возвращает true, если строка содержит только пробельные символы?
Was this page helpful?