JavaRush/Java блог/Random/Метод IndexOf класса String: зачем он нужен и как работае...
Автор
Василий Малик
Senior Java-разработчик в CodeGym

Метод IndexOf класса String: зачем он нужен и как работает

Статья из группы Random
участников
Привет! Программисты часто пользуются методами на автомате, не задумываясь, как они работают. Речь идет о базовых методах, которые вы обязаны знать.

Что такое перегрузка методов?

Прежде, чем мы рассмотрим метод, о котором упомянули в заголовке, давайте вспомним (а кто-то и узнает), что такое перегрузка методов. Перегрузка методов Java разрешает определение внутри одного класса двух или более методов с одним и тем же именем. Это возможно только в том случае, если у них есть разные входящие параметры. В этом случае методы и называют перегруженными, а сам процесс — перегрузкой методов.Метод IndexOf класса String: зачем он нужен и как работает - 1Перегрузка методов — это один из основополагающих принципов полиморфизма в Java.

Для чего нужен метод indexOf класса String

Представьте, что у вас есть длинная строка. К примеру, письмо, и вам нужно найти место, в котором происходит первое обращение к адресату по имени, которое вы уже знаете. Как вы это сделаете? Воспользуетесь методом indexOf java класса String. Этот метод — типичный пример перегрузки методов, о которой мы говорили выше.

Варианты метода indexOf

Метод java string indexOf имеет четыре различные вариации:

№ 1. indexOf(int ch)

Метод int indexOf(int ch) возвращает индекс в данной строке первого вхождения указанного символа. Другими словами, мы получим номер первого вхождения заданного символа, считая слева-направо. Пример:
public static void main(String[] args) {
   String str = "Diego, where is my money?";
   int value = str.indexOf('e');
   System.out.println(value);
}
Вывод в консоль:

2
Если же символ который мы ищем, отсутствует в данной строке, мы получим -1.
public static void main(String[] args) {
   String str = "Diego, where is my money?";
   int value = str.indexOf('j');
   System.out.println(value);
}
Вывод в консоль:

-1
P. S. Чтобы ничего не перепутать, нужно не забывать, что отсчет символов в строке идет не с «‎1,2,3…»‎, а с «‎0,1,2...»‎

№ 2. indexOf(int ch, int fromIndex)

Метод int indexOf(int ch, int fromIndex) возвращает индекс в этой строке первого вхождения указанного символа, начиная поиск по указанному индексу. Данный метод является более модернизированной версией предыдущего. C разницей в том, что мы указываем номер элемента, с которого собственно и начнется поиск. Пример:
public static void main(String[] args) {
   String str = "Diego, where is my money?";
   int value = str.indexOf('e',5);
   System.out.println(value);
}
Вывод в консоль:

9
Если индекс, из которого будет вестись поиск, превышает длину строки, то ответ будет -1.Метод IndexOf класса String: зачем он нужен и как работает - 2Как вы наверное заметили, в сигнатуре этих двух методов (то, что принимают методы в качестве аргументов), тип для передаваемого символа указан как int, а не char. Тем не менее, мы передавали char. Все потому, что строки хранятся в виде массива байтов, где ячейки соответствует определенному символу типа char. Соответствие между байтами и char проводится по таблице ASCII. ASCII (American standard code for information interchange) — таблица, в которой распространённые печатные и непечатные символы сопоставлены с числовыми кодами. Поэтому когда передается некоторый символ char, он автоматически конвертируется в число, которое представляет данный символ в таблице ASCII. Исходя из этого, мы можем передать в метод непосредственно число (int), которое соответствует нужному нам символу. Например, символу ‘e’ в таблице ASCII соответствует число 101, поэтому мы можем повторить предыдущий пример, но уже без char:
public static void main(String[] args) {
   String str = "Diego, where is my money?";
   int value = str.indexOf(101,5);
   System.out.println(value);
}
Вывод в консоль у нас не изменился:

9
P. S. В некоторых случаях данные методы взаимозаменяемые, как вот например str.indexOf('e'); будет аналогичен – str.indexOf('e', 0);.

№ 3. indexOf(String str)

Метод int indexOf(String str) возвращает индекс в данной строке первого вхождения указанной подстроки. Он кардинально отличается от первого варианта тем, что данный метод ищет уже целую подстроку (String). Благодаря этому мы можем искать уже что-то более конкретное. Пример:
public static void main(String[] args) {
   String str = "Diego, where is my money? Diego,you made me very upset";
   int value = str.indexOf("Diego");
   System.out.println(value);
}
Вывод в консоль:

0
P. S. Все вариации indexOf чувствительны к регистру: символы верхнего регистра (большие буквы) и символы нижнего регистра (маленькие буквы) считаются как разные. Будьте внимательны.

№ 4. indexOf(String str, int fromIndex)

Метод indexOf(String str, int fromIndex) возвращает индекс в этой строке первого вхождения указанной подстроки, начиная с указанного индекса. Данный вариант является опять же более модернизированным предыдущим вариантом, но уже с указанием места, с которого будет вестись поиск. Пример:
public static void main(String[] args) {
   String str = "Diego, where is my money? Diego,you made me very upset";
   int value = str.indexOf("Diego", 1);
   System.out.println(value);
}
Вывод в консоль:

26
P. S. Если задать отрицательный стартовый индекс, то метод indexOf воспримет его как 0. В таком случае метод опять же станет аналогичен предыдущему (в котором не указан стартовый индекс). Это все на сегодня. Теперь твой запас знаний стал больше благодаря indexOf Java!
Комментарии (19)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #3346440
Уровень 2
6 сентября 2023, 13:01
А что если в слове две или три одинаковые буквы и надо получить индекс всех этих букв?
ArkadyKuz QA в X5
15 сентября 2023, 21:59
Готового метода под эту цель нет. Тут стоит самостоятельно реализовать сбор индексов. Например, можно в цикле пройти по строке, собирая индексы вхождения. Вопрос на stackoverflow: https://stackoverflow.com/questions/5034442/indexes-of-all-occurrences-of-character-in-a-string
Private Joker
Уровень 26
25 февраля 2023, 16:29
Не очень понял термин "вхождения" чего, куда, как это работает, то что входит?
Denys Sukhoivan
Уровень 30
Expert
3 марта 2023, 13:10
я как-то тоже не понял кто в кого входит. Терменология просто топ) ничего не понятно, НО ОЧЕНЬ интересно)
Lo
Уровень 35
Expert
3 июня 2023, 14:26
В данном случае имеется в виду, первое вхождение - это то самое место, где то,что мы указали встречается впервые, ну то есть первая встреча этого индекса в строке)
Ro_
Уровень 11
21 ноября 2022, 14:25
Спасибо, хорошее дополнение к статье курса
Yaten Ko
Уровень 4
26 января 2022, 21:51
Не пойму, почему в конце вышло 26, кто нибудь обьяснит?
Алексей
Уровень 35
29 января 2022, 06:02
("Diego", 1); потому что поиск со второго индекса. Первое слово диего на индексе 0. А выдаёт индекс этого диего (? Diego,)
Yaten Ko
Уровень 4
9 февраля 2022, 09:15
счет ведется с пробелами, верно?
Василиса
Уровень 18
17 июня 2022, 06:33
да, пробел это тоже символ
Private Joker
Уровень 26
25 февраля 2023, 16:28
Получается что первое слово на индексе 1 "iego" , поэтому он его пропускает?
Максим
Уровень 22
Expert
14 августа 2023, 14:24
Да,получается что Diego уже начинается с 26 индекса,так как 0 мы пропустили указав то что поиск ведём с 1 элемента
Serhio Gonsales
Уровень 35
4 августа 2021, 10:35
Понял
Jack Daniel
Уровень 28
29 мая 2021, 09:29
Больше статей с лягушками!
Павел студент на стероидах в Java Syntax Pro beta
24 августа 2020, 16:44
"Это все на сегодня" или "Это всё на сегодня"?
Interstellar Java Developer в EPAM Expert
20 августа 2020, 07:20
После лягушки во 2-м абзаце у вас дважды ACII вместо ASCII.
Итай Работает в Безработный Expert
20 августа 2020, 00:33
А у вас стол заказов работает? Нужно больше статей на сложные темы: Рекурсия, рефлексия, алгоритмы сортировок и ветвлений в коллекциях и т.д.
Глеб Стадник
Уровень 33
20 августа 2020, 07:24
Сто лайков этому господину ! Еще бы про фраемворки ,и я не про то, как сделать "привет мир" на странице , а как они внутри устроены
Taisto
Уровень 22
20 августа 2020, 10:20
Нужно больше статей на ВСЕ темы!