JavaRush /Java блог /Random /Кофе-брейк #116. Как использовать указатели функций в Jav...

Кофе-брейк #116. Как использовать указатели функций в Java. indexOf в Java — Как найти индекс строки в Java

Статья из группы Random

Как использовать указатели функций в Java

Источник: Dev.to Указатели (Pointers) — это объекты, которые хранят адрес памяти и могут экономить память, напрямую указывая на целевой объект, массив или адрес переменной вместо передачи по значению. К сожалению, в Java нет “настоящей” концепции указателей. Но к счастью для нас, существует обходной путь с использованием ссылок на методы, который близок к реальному. Кофе-брейк #116. Как использовать указатели функций в Java. indexOf в Java — Как найти индекс строки в Java - 1

Указатели функций

Указатель функции — это указатель, указывающий на адрес функции. В некоторых случаях используется создание подпрограммы обратного вызова путем создания функции, которая вызывает другую функцию на основе ее выполнения, или сохранения массива указателей функций для динамически вызываемых методов (например, сохранение инструкций процессора для эмулятора).

Симуляция указателя функции

Существует четыре типа ссылок на методы. Мы используем тип, который ссылается на метод экземпляра определенного объекта. Давайте начнем с определения интерфейса, который определяет сигнатуры методов, на которые вы указываете.

// Wrapping interface
private interface FunctionPointer {
  // Method signatures of pointed method
  void methodSignature(int a);
}
Затем создадим методы с сигнатурой целевого метода.

public void method1(int b) {
  System.out.println("Called method1 with integer " + b);
}

public void method2(int v) {
  System.out.println("Called method2 with integer " + v);
}

public void method3(int a) {
  System.out.println("Called method3 with integer " + a);
}
Следующий шаг — создание переменных интерфейса-обертки и присвоение им методов. Переменные будут действовать как указатель на функцию, которую нужно сохранить или выполнить.

// Create a variable of the interface and assign
// the method references
FunctionPointer pointer1 = this::method1;
FunctionPointer pointer2 = this::method2;

// Call both methods using their "pointer"
pointer1.methodSignature(3);
pointer2.methodSignature(2);

// Reassign and call pointer 1
pointer1 = this::method3;

pointer1.methodSignature(5);
Called method1 with integer 3 Called method2 with integer 2 Called method3 with integer 5

Использование лямбда-выражений

Ссылки на методы можно назначать с помощью лямбда-выражений.

// Create a method reference and assign a methods using a lambda.
FunctionPointer pointer1 =
  (a) -> System.out.println("Called pointer1 with int " + a);

FunctionPointer pointer2 =
  (b) -> System.out.println("Called pointer2 with int " + b);

Массив указателей функций

Функциональность массива ссылок на методы можно эмулировать, создав массив интерфейса-оболочки.

// Create an array of "pointers"
FunctionPointer[] functionPointersArray = new FunctionPointer[3];

// Assign methods
functionPointersArray[0] = this::method1;
functionPointersArray[1] = this::method2;
functionPointersArray[2] = this::method3;

// Call methods    
functionPointersArray[0].methodSignature(3);
functionPointersArray[1].methodSignature(4);
functionPointersArray[2].methodSignature(5);

Указатель функции против прямого вызова

Если сравнить оба варианта, то прямой вызов метода почти в 5 раз быстрее, чем использование ссылки на метод. Все из-за дополнительного шага для вызова лямбда-выражения по сравнению с хранимым методом. Но вы скорее всегод не заметите потери производительности, так что не беспокойтесь об этом.

Заключение

Указатели — это переменные, которые указывают непосредственно на адрес объекта, а не значение. Указатель функции напрямую указывает на адрес функции, что может уменьшить потребление памяти. Java не имеет указателей, но может эмулировать поведение, используя ссылки на методы или лямбда-выражения. Использование ссылки на метод медленнее, чем прямой вызов метода, но это никак не мешает ее использованию.

indexOf в Java — Как найти индекс строки в Java

Источник: FreeCodeCamp Строка представляет собой набор символов, заключенных в двойные кавычки. Метод indexOf возвращает позицию индекса указанного символа или подстроки в строке. В этой статье мы узнаем о синтаксисе различных методов indexOf. Также мы рассмотрим примеры, которые помогут понять и эффективно использовать поиск индекса символа или подстроки в коде Java. Кофе-брейк #116. Как использовать указатели функций в Java. indexOf в Java — Как найти индекс строки в Java - 2

Синтаксис метода indexOf

Метод indexOf имеет такие методы:

public int indexOf(int char)
public int indexOf(int char, int fromIndex)
public int indexOf(String str)
public int indexOf(String str, int fromIndex)
Давайте объясним эти параметры:
  • char представляет один символ в строке.
  • fromIndex обозначает позицию, с которой должен начинаться поиск индекса символа или подстроки. Это важно, когда у вас есть два символа/строки, которые имеют одинаковое значение в строке. С помощью этого параметра вы можете указать методу indexOf, с чего начать работу.
  • str представляет подстроку в строке.
Не беспокойтесь, если вы еще не понимаете, как все это работает, — примеры все прояснят!

Как использовать метод indexOf в Java

В первом примере мы найдем индекс одного символа в строке. Это поможет нам понять метод public int indexOf(int char).

Пример метода indexOf(int Char)


public class Main {
  public static void main(String[] args) {
    String greetings = "Hello World";
    
    System.out.println(greetings.indexOf("o"));
    
    // 4
  }
}
В приведенном выше коде мы получили возвращенный нам индекс символа “о”, который равен 4. У нас есть два символа “o”, но возвращен были лишь индекс первого. В следующем примере мы увидим, как мы можем вернуть индекс второго “о”. Если вам интересно, как получаются порядковые номера, то вы должны заметить, что первый символ в строке имеет индекс, равный нулю, второй символ имеет индекс, равный единице, и так далее.

Пример метода indexOf(int Char, Int fromIndex)

Вот пример, объясняющий метод int indexOf(int char, int fromIndex):

public class Main {
  public static void main(String[] args) {
    String greetings = "Hello World";
    
    System.out.println(greetings.indexOf("o", 5));
    
    // 7
  }
}
В приведенном выше примере мы указываем методу indexOf начать работу с пятого индекса. H => index 0 e => index 1 l => index 2 l => index 3 0 => index 4 Обратите внимание, что индекс 5 не является символом “W”. Пятый индекс — это пробел между “Hello” и “World”. Таким образом в этом коде все остальные символы, предшествующие пятому индексу, будут игнорироваться. 7 возвращается как индекс второго символа “o”.

Пример метода Int indexOf(String Str)

В следующем примере мы поймем, как работает метод public int indexOf(String str), который возвращает индекс подстроки.

public class Main {
  public static void main(String[] args) {
    String motivation = "Coding can be difficult but don't give up";
    
    System.out.println(motivation.indexOf("be"));
    
    // 11
  }
}
Интересно, как мы вернули 11? Вы должны просмотреть последний раздел, чтобы понять, как учитываются индексы, а как — пробелы между подстроками, которые также считаются индексами. Обратите внимание, что когда подстрока передается в качестве параметра, возвращаемый индекс — это индекс первого символа в подстроке. 11 — это индекс символа “b”.

Пример метода indexOf(String Str, Int fromIndex)

Последний метод — public int indexOf(String str, int fromIndex) — такой же, как и метод public int indexOf(int char, int fromIndex). Он возвращает индекс из указанной позиции.

public class Main {
  public static void main(String[] args) {
    String motivation = "The for loop is used for the following";
    
    System.out.println(motivation.indexOf("for", 5));
    
    // 21
  }
}
В этом примере мы указали, что метод должен начинать свою работу с пятого индекса, который идет после первой подстроки for. 21 — это индекс второй подстроки for. Наконец, когда мы передаем символ или подстроку, которых нет в строке, метод indexOf вернет значение -1. Вот пример:

public class Main {
  public static void main(String[] args) {
    String motivation = "The for loop is used for the following";
    
    System.out.println(motivation.indexOf("code"));
    
    // -1
  }
}

Заключение

В этой статье мы узнали, как использовать четыре метода indexOf, с наглядными примерами. Мы также увидели, как выглядит синтаксис каждого из этих методов и как они сообщают индексу о возврате. Кроме того, нам удалось узнать, что происходит, когда в качестве параметра передается несуществующий символ или подстрока.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ