Строки и их методы
Чему вы научитесь:
- читать строку по позициям и вырезать из неё часть методами
charAtиsubstring; - объяснять, почему метод строки не меняет её, а возвращает новую;
- сравнивать строки через
equalsи объяснять, когда==даётtrue; - собирать строку в цикле через
StringBuilderи обращаться с символамиcharкак с числами.
Представьте напечатанную карточку с текстом. Буквы стоят на ней в ряд, каждая в своей клетке, а у клеток есть номера. С карточкой можно делать многое: посчитать клетки, прочитать букву в любой из них, найти слово. Одного сделать нельзя — стереть или исправить букву: карточка напечатана.
Строка в Java — такая карточка. Текст хранят в переменной типа String: String name = "Anna";. Программы работают с текстом постоянно: имена, сообщения, команды. Часто текст нужно не только напечатать, но и разобрать: узнать длину, взять первую букву, найти слово, вырезать кусок. Для этого у строки есть свои методы:
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
}
}Давайте разберём программу по строкам:
String word = "Java";кладёт в переменнуюwordстроку из четырёх символов.word.length()возвращает длину строки —4.word.charAt(0)возвращает символ в клетке с номером 0 —J.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:
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 остаётся целой.
Поиск и новые строки
Ещё несколько методов, которые нужны почти в каждой программе:
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Разберём их по порядку:
strip()убирает пробелы в начале и в конце строки. Квадратные скобки при печати показывают, что пробелов не осталось.indexOf("Bob")ищет подстроку и возвращает индекс, с которого она начинается, —4. Если подстроки нет, он возвращает-1.contains("Hi")отвечаетtrueилиfalse: есть ли в строке такая подстрока.toUpperCase()возвращает строку из заглавных букв, аtoLowerCase()— из строчных.replace("Bob", "Ann")заменяет каждое вхождение первой подстроки на вторую.isBlank()даётtrue, если в строке нет ничего, кроме пробелов. Для пустой строки""он тоже даётtrue.
Частая ошибка
Длину строки запросили без скобок:
String word = "Java";
int n = word.length; // ✗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, если её нет.