JavaRush /Курсы /Java Syntax Pro /Работа со строками в Java

Работа со строками в Java

Java Syntax Pro
9 уровень , 4 лекция
Открыта

1. Сравнение строк

Сравнение — одна из самых частых вещей, которая делается со строками. У класса String более десяти различных методов, которые используются для сравнения строк со строками. Ниже мы рассмотрим семь основных.

Методы Описание
boolean equals(String str)
Строки считаются равными, если все их символы совпадают.
boolean equalsIgnoreCase(String str)
Сравнивает строки, игнорируя регистр (размер) букв
int compareTo(String str)
Сравнивает строки лексикографически. Возвращает 0, если строки равны. Число меньше нуля, если текущая строка меньше строки-параметра. Число больше нуля, если текущая строка больше строки-параметра
int compareToIgnoreCase(String str)
Сравнивает строки лексикографически, игнорирует регистр. Возвращает 0, если строки равны. Число меньше нуля, если текущая строка меньше строки-параметра. Число больше нуля, если текущая строка больше строки-параметра
boolean regionMatches(int toffset, String str, int offset, int len)
Сравнивает части строк
boolean startsWith(String prefix)
Проверяет, что текущая строка начинается со строки prefix
boolean endsWith(String suffix)
Проверяет, что текущая строка заканчивается на строку suffix

Допустим, вы хотите написать программу, которая просит пользователя ввести путь к файлу и проверяет, что это за файл по его расширению. Тогда код такой программы мог бы выглядеть примерно так:

Код Примечания
Scanner console = new Scanner(System.in);
String path = console.nextLine();

if (path.endsWith(".jpg") || path.endsWith(".jpeg"))
{
   System.out.println("Это Jpeg!");
}
else if (path.endsWith(".htm") || path.endsWith(".html"))
{
   System.out.println("Это HTML-страница");
}
else if (path.endsWith(".doc") || path.endsWith(".docx"))
{
   System.out.println("Это документ Word");
}
else
{
   System.out.println("Неизвестный формат");
}
Создание объекта Scanner
Чтение строки с консоли

Проверяем, что строка path оканчивается на заданную строку


2. Поиск подстрок

Вторая по популярности операция после сравнения строк — это поиск одной строки в другой. Для этого у класса String тоже есть немного методов:

Методы Описание
int indexOf(String str)
Ищет строку str в текущей строке. Возвращает индекс первого символа встретившейся строки.
int indexOf(String str, int index)
Ищет строку str в текущей строке, пропустив index первых символов. Возвращает индекс найденного вхождения.
int lastIndexOf(String str)
Ищет строку str в текущей строке с конца. Возвращает индекс первого вхождения.
int lastIndexOf(String str, int index)
Ищет строку str в текущей строке с конца, пропустив index первых символов.
boolean matches(String regex)
Проверяет, что текущая строка совпадает с шаблоном, заданным регулярным выражением.

Методы indexOf(String) и indexOf(String, index) часто используются в паре. Первый позволяет найти первое вхождение переданной подстроки в текущей строке. А второй метод позволяет найти второе, третье и т.д. вхождения за счет того, что пропускает первые index символов.

Допустим, у нас есть url типа такого: «https://domen.com/about/reviews», и мы хотим заменить имя домена на javarush.com. Домены в урлах могут быть разными, но мы знаем, что:

  • Перед именем домена идут два слеша //
  • После имени домена идет одинарный слеш /

Вот как бы выглядел код такой программы:

Код Примечания
Scanner console = new Scanner(System.in);
String path = console.nextLine();

int index = path.indexOf("//");
int index2 = path.indexOf("/", index + 2);

String first = path.substring(0, index + 2);
String last = path.substring(index2);

String result = first + "javarush.com" + last;
System.out.println(result);
Создание объекта Scanner
Чтение строки с консоли

Получаем индекс первого вхождения строки //
Получаем индекс первого вхождения строки /, но ищем только после символов //.
Получаем строку от начала и заканчивая символами //
Получаем строку от / и до конца.

Склеиваем строки и новый домен.

Методы lastIndexOf(String) и lastIndexOf(String, index) работают точно так же, только поиск ведется с конца строки к началу.



3. Создание подстрок

Кроме сравнения строк и поиска подстрок, есть еще одно очень популярное действие — получение подстроки из строки. В предыдущем примере вы как раз видели вызов метода substring(), который возвращал часть строки.

Вот список из 8 методов получения подстрок из текущей строки:

Методы Описание
String substring(int beginIndex, int endIndex)
Возвращает подстроку, заданную интервалом символов beginIndex..endIndex.
String repeat(int count)
Повторяет текущую строку count раз
String replace(char oldChar, char newChar)
Возвращает новую строку: заменяет символ oldChar на символ newChar
String replaceFirst(String regex, String replacement)
Заменяет в текущей строке подстроку, заданную регулярным выражением.
String replaceAll(String regex, String replacement)
Заменяет в текущей строке все подстроки, совпадающие с регулярным выражением.
String toLowerCase()
Преобразует строку к нижнему регистру
String toUpperCase()
Преобразует строку к верхнему регистру
String trim()
Удаляет все пробелы в начале и конце строки

Вот краткое описание существующих методов:

Метод substring(int beginIndex, int endIndex)

Метод substring возвращает новую строку, которая состоит из символов текущей строки, начиная с символа под номером beginIndex и заканчивая endIndex. Как и во всех интервалах в Java, символ с номером endIndex в интервал не входит. Примеры:

Код Результат
"Привет".substring(0, 3);
"При"
ривет".substring(1, 4);
"рив"
ривет".substring(1, 6);
"ривет"
ривет".substring(1);
"ривет"

Если параметр endIndex не указывается (а так можно), подстрока берется от символа beginIndex и до конца строки.

Метод repeat(int n)

Метод repeat просто повторяет текущую строку n раз. Пример:

Код Результат
"Привет".repeat(3);
"ПриветПриветПривет"
"Привет".repeat(2);
"ПриветПривет"
"Привет".repeat(1);
"Привет"
"Привет".repeat(0);
""

Метод replace(char oldChar, char newChar)

Метод replace() возвращает новую строку, в которой все символы oldChar заменены на символ newChar. Длина строки при этом не меняется. Пример:

Код Результат
"Привет".replace('Я', 'я');
"Привет"
"Привет".replace('т', 'д');
"Привед"
"Привет".replace('и', 'е');
"Превет"
"Привет".replace('и', 'ы');
"Прывет"

Методы replaceFirst() и replaceAll()

Метод replaceAll() заменяет все вхождения одной подстроки на другую. Метод replaceFirst() заменяет первое вхождение переданной подстроки на заданную подстроку. Строка, которую заменяют, задается регулярным выражением. Разбирать регулярные выражения мы будем в квесте Java Multithreading.

Примеры:

Код Результат
"Good news everyone!".replaceAll("e.", "EX");
"Good nEXs EXEXyonEX"
"Good news everyone!".replaceAll("o.", "-o-");
"G-o-d news every-o-e!"
"Good news everyone!".replaceFirst("e.", "EX");
"Good nEXs everyone!"
"Good news everyone!".replaceFirst("o.", "-o-");
"G-o-d news everyone!"

Методы toLowerCase() и toUpperCase()

С этими методами мы познакомились, когда только в первый раз учились вызывать методы класса String.

Метод trim()

Метод trim() удаляет у строки пробелы с начала и с конца строки. Пробелы внутри строки никто не трогает. Примеры:

Код Результат
"     ".trim();
""
"Привет".trim();
"Привет"
" Привет\n как дела?\n   ".trim();
"Привет\n как дела?\n"
"  Пароль\n   \n ".trim();
"Пароль\n   \n"

Комментарии (518)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Grigoryvvv Уровень 14 Expert
14 ноября 2025
14.11.2025 / 10 уровень
Anonymous #3663695 Уровень 8
5 ноября 2025
public class Solution { public static void main(String[] args) { String path = "/usr/java/jdk1.8/bin/"; String jdk13 = "jdk-13"; System.out.println(changePath(path, jdk13)); } public static String changePath(String path, String jdk) { int index = path.indexOf("jdk"); //Ищем начальный индекс ключевого слова int index1 = path.indexOf("/",index); //Ищем последний индекс по ключевому символу String index2 = path.substring(index,index1); //"Вырезаем" диапазон индексов с версией return path.replace(index2, jdk); //Реплейсаем и возвращаем измененную строку } }
Маргарита Уровень 14
19 ноября 2025
Нормальные ребята всегда идут в обход, ну и разраб должен быть ленивым и писать меньше букавАк)))

public static String changePath(String path, String jdk) {
   var regex = "\\/jdk[^\\/]+";
   return path.replaceFirst(regex, "/" + jdk);
}
Маргарита Уровень 14
19 ноября 2025
Ну и https://regex101.com/ в помощь
Алина Уровень 10
22 октября 2025
Все обсуждают задачку про "jdk". Я просто сделала как в примере 😁

public class Solution {
    public static void main(String[] args) {
        String path = "/usr/java/jdk1.8/bin/";

        String jdk13 = "jdk-13";
        System.out.println(changePath(path, jdk13));
    }

    public static String changePath(String path, String jdk) {
        //напишите тут ваш код
        int index = path.indexOf("jdk");
        int index2 = path.indexOf("/", index + 1);

        String first = path.substring(0, index);
        String last = path.substring(index2);

        return first + jdk + last;
    }
}
Илья Езугбая Уровень 37
14 октября 2025
Рад за тех, кто добрался до этого этапа. Всем желаю успехов в дальнейшем изучении материала. Кому не трудно поставьте лайк для ачивки
rorsrark Уровень 10
5 октября 2025
Решил попробовать сделать 3-ю задачу в одну строчку. Будь это в реальном проекте, заслужил бы 100 дней кипящего поноса?

return path.replaceFirst(path.substring(path.indexOf("jdk"), path.indexOf("/", path.indexOf("jdk"))), jdk);
Алексей Уровень 12
1 октября 2025

    private static String[] protocols = {"https", "http"};
    private static String[] domains = {"com", "net", "org", "ru"};
    
    public static String checkProtocol(String url) {
        for (var protocol : protocols) {
            if (url.startsWith(protocol + "://")) {
                return protocol;
            }
        }
        return "неизвестный";
    }

    public static String checkDomain(String url) {
        for (var domain : domains) {
            if (url.endsWith("." + domain)) {
                return domain;
            }
        }
        return "неизвестный";
    }
Segafoxs Уровень 26
26 сентября 2025
public static String changePath(String path, String jdk) { int index = path.indexOf("jdk"); String sub = path.substring(index); int index2 = sub.indexOf("/"); return path.replaceAll(sub.substring(0, index2), jdk); }
Dmitry Terekhov Уровень 24
29 августа 2025
У меня вообще последняя задача была сразу с готовым кодом.. я просто зашел, а там уже полностью готовый код, который прошёл проверку без изменений.
REK.QA Уровень 4
4 июля 2025
По последней задаче сделал так. Работает но не принимает... public static String changePath(String path, String jdk) { path = path.replace("jdk1.8", jdk); return path; }
sport Уровень 17
8 июля 2025
если делать через replace, то в скобках вместо этого "jdk1.8" нужно использовать регулярные выражения, поэтому и не принимает.
9 сентября 2025
Ты захардкодил jdk1.8. А если во входных параметрах было другое значение переменной path? Думаю нужно избавиться от хардкода, т.е. вычислить индексы начала и конца подстроки с jdk, извлечь это все в отдельную переменную и потом уже использовать repalce
REK.QA Уровень 4
4 июля 2025
По первой задаче всё компилируется и всё правильно выводит, но проверку не проходит. Что не так? public static String checkProtocol(String url) { String result = "неизвестный"; if (url.startsWith("https:")) { result = "https:"; } if (url.startsWith("http:")) { result = "http:"; } return result; } public static String checkDomain(String url) { String result = "неизвестный"; if (url.endsWith(".com")) { result = ".com"; } if (url.endsWith(".net")) { result = ".net"; } if (url.endsWith(".org")) { result = ".org"; } if (url.endsWith(".ru")) { result = ".ru"; } return result; }
Lobanzer Уровень 25
8 июля 2025
Убери точку, в условии проверка без точки (.ru,.org) нужно просто(ru,org)
Eugene Volkov Уровень 35
19 сентября 2025
в первом методе после проверки первого if, идет проверка второго if, потому что перед ним нету else. а http входит в https, поэтому если у тебя попадается url с https, result присваивается https, как ты и задумывал, но затем идет прверка на http, и оно его тоже находит как начало от https, и result станет http. поэтому не проходит проверку