- С помощью методов
Stringизвлекать части текста, искать и преобразовывать его - Правильно сравнивать строки с помощью
equals - Собирать текст с помощью
String.formatиStringBuilder
Логины, SMS, описания товаров, поисковые запросы — значительная часть данных, с которыми работают программы, это текст. В Java текст представлен объектами класса String. В этом уроке ты научишься разрезать строки, искать в них, сравнивать их и эффективно собирать.
Методы String
Строка — это последовательность символов, и у каждого символа есть индекс. Индексы начинаются с 0: в строке "Baku" символ B имеет индекс 0, а u — индекс 3. У класса String десятки готовых методов; их вызывают через точку: text.length().
public class Main {
public static void main(String[] args) {
String city = "Baku";
String country = "Azerbaijan";
String text = city + ", " + country;
System.out.println(text);
System.out.println(text.length());
System.out.println(text.charAt(0));
System.out.println(text.toUpperCase());
System.out.println(text.indexOf("Azer"));
System.out.println(text.substring(6));
System.out.println(text.substring(0, 4));
System.out.println(text.contains("ku"));
System.out.println(text.replace("Baku", "Ganja"));
System.out.println(" hello ".trim() + "!");
}
}Baku, Azerbaijan 16 B BAKU, AZERBAIJAN 6 Azerbaijan Baku true Ganja, Azerbaijan hello!
| Метод | Что делает | В примере |
|---|---|---|
length() | возвращает количество символов | 16 |
charAt(i) | символ с индексом i | charAt(0) → B |
indexOf(s) | где впервые начинается s (−1, если не найдено) | indexOf("Azer") → 6 |
substring(a, b) | часть от a до b (не включая b) | substring(0, 4) → Baku |
toUpperCase(), toLowerCase() | переводит в верхний или нижний регистр | BAKU, AZERBAIJAN |
contains(s) | есть ли s внутри строки | contains("ku") → true |
replace(a, b) | заменяет все a на b | Ganja, Azerbaijan |
trim() | удаляет пробелы в начале и в конце | hello |
Строки неизменяемы
После создания объект String изменить нельзя — он неизменяемый (immutable). Методы вроде toUpperCase() не меняют старую строку, а возвращают новую. Чтобы сохранить результат, присвой его переменной.
public class Main {
public static void main(String[] args) {
String name = "aysel";
name.toUpperCase();
System.out.println(name);
name = name.toUpperCase();
System.out.println(name);
}
}aysel AYSEL
Сравнение строк
Оператор == сравнивает не текст строк, а то, являются ли они одним и тем же объектом в памяти. Чтобы сравнить содержимое, используй equals(), а чтобы не учитывать регистр букв — equalsIgnoreCase().
public class Main {
public static void main(String[] args) {
String a = "java";
String b = new String("java");
String c = "JAVA";
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
System.out.println(a.equalsIgnoreCase(c));
}
}false true false true
Форматирование и склейка
Если собирать длинный текст через +, его становится трудно читать. Метод String.format() принимает шаблон: вместо %s подставляется строка, вместо %d — целое число, вместо %.1f — дробное число с одним знаком после запятой, а %% выводит знак процента. System.out.printf() сразу печатает такой шаблон, а %n означает новую строку.
public class Main {
public static void main(String[] args) {
String name = "Elvin";
int score = 47;
double percent = 94.0;
String report = String.format("%s scored %d points (%.1f%%)", name, score, percent);
System.out.println(report);
System.out.printf("Price: %.2f AZN%n", 12.5);
System.out.println("a" + 1 + 2);
System.out.println(1 + 2 + "a");
}
}Elvin scored 47 points (94.0%) Price: 12.50 AZN a12 3a
94,0 и 12,50.Посмотри на две последние строки: + вычисляется слева направо. "a" + 1 — уже строка, поэтому 2 тоже приклеивается к ней как текст. А в 1 + 2 + "a" сначала складываются числа и только потом результат склеивается с текстом.
StringBuilder: изменяемая строка
Так как строки неизменяемы, каждая операция + создаёт новый объект. Когда текст собирается из сотен маленьких кусочков (например, в цикле), это впустую тратит память и время. **StringBuilder** — изменяемая строка: append() добавляет в конец, insert() вставляет в любое место, reverse() переворачивает, а toString() возвращает готовую String.
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
sb.append(", ");
sb.append("Elvin").append('!');
System.out.println(sb);
sb.insert(0, ">> ");
System.out.println(sb);
System.out.println(sb.length());
sb.reverse();
System.out.println(sb);
String word = "level";
String reversed = new StringBuilder(word).reverse().toString();
System.out.println(word.equals(reversed));
}
}Hello, Elvin! >> Hello, Elvin! 16 !nivlE ,olleH >> true
Последние строки проверяют палиндром — слово, которое одинаково читается в обе стороны: переворачиваем level и сравниваем с исходным. Вызовы можно объединять в цепочку append(...).append(...), потому что каждый append возвращает тот же самый StringBuilder.
Главное
- Индексы строки начинаются с 0; последний символ имеет индекс
length() - 1. Stringнеизменяем: методы вродеtoUpperCase()иreplace()возвращают новую строку.- Содержимое строк сравнивай через
equals(), а не через==. String.format()иprintf()собирают текст по шаблону:%s,%d,%.2f,%n.StringBuilder— изменяемая строка:append,insert,reverse,toString.
Проверь себя
Вопросов: 10. Каждый правильный ответ приносит XP.
"Java".charAt(1)?