Java で関数ポインタを使用する方法
出典: Dev.to ポインタはメモリ アドレスを格納するオブジェクトであり、値を渡す代わりにターゲット オブジェクト、配列、または変数アドレスを直接指すことでメモリを節約できます。残念ながら、Java にはポインタの「本当の」概念はありません。しかし幸運なことに、実際のものに近いメソッド参照を使用した回避策があります。関数ポインタ
関数ポインタは、関数のアドレスを指すポインタです。一部の使用例には、実行に基づいて別の関数を呼び出す関数を作成することによるコールバック ルーチンの作成や、動的に呼び出されるメソッドの関数ポインターの配列の格納 (たとえば、エミュレータ用のプロセッサ命令の格納) が含まれます。関数ポインタのシミュレーション
メソッド参照には4 つのタイプがあります。特定のオブジェクトのインスタンス メソッドを参照する型を使用します。まず、指定するメソッドのシグネチャを定義するインターフェイスを定義します。// 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);
整数 3 でメソッド 1 を呼び出した 整数 2 でメソッド 2 を呼び出した 整数 5 でメソッド 3 を呼び出した
ラムダ式の使用
メソッド参照はラムダ式を使用して割り当てることができます。// 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 倍高速です。これはすべて、ストアド メソッドと比較してラムダ式を呼び出すという追加の手順が原因です。ただし、1 年以内にパフォーマンスの低下に気づくことはおそらくないので、心配する必要はありません。結論
ポインタは、値ではなくオブジェクトのアドレスを直接指す変数です。関数ポインタは関数アドレスを直接指すため、メモリ消費量を削減できます。Java にはポインターがありませんが、メソッド参照またはラムダ式を使用して動作をエミュレートできます。メソッド参照を使用すると、メソッドを直接呼び出すよりも遅くなりますが、メソッドの使用が妨げられることはありません。Java のindexOf - Java で文字列のインデックスを見つける方法
出典: FreeCodeCamp 文字列は、二重引用符で囲まれた一連の文字です。IndexOfメソッドは、文字列内の指定された文字または部分文字列のインデックス位置を返します。この記事では、さまざまなindexOfメソッドの構文について学びます。また、Java コード内の文字または部分文字列のインデックスの検索を理解し、効果的に使用するのに役立つ例も見ていきます。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 は1 行につき 1 文字を表します。
- fromIndex は、文字または部分文字列のインデックスの検索を開始する位置を指定します。これは、文字列内に同じ値を持つ 2 つの文字/文字列がある場合に重要です。このパラメータを使用すると、 indexOfメソッドにどこから開始するかを指示できます。
- str は文字列内の部分文字列を表します。
JavaでindexOfメソッドを使用する方法
最初の例では、文字列内の 1 つの文字のインデックスを見つけます。これは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
}
}
上記のコードでは、文字「o」のインデックス (4) が返されました。文字「o」は 2 つありますが、最初の文字のインデックスのみが返されました。次の例では、2 番目の「o」のインデックスを返す方法を示します。シーケンス番号がどのように取得されるのか疑問に思っている場合は、文字列の最初の文字のインデックスが 0、2 番目の文字のインデックスが 1 であることに気づくでしょう。
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メソッドに 5 番目のインデックスから作業を開始するように指示しています。H => インデックス 0 e => インデックス 1 l => インデックス 2 l => インデックス 3 0 => インデックス 4 インデックス 5 は「W」文字ではないことに注意してください。5 番目のインデックスは、「Hello」と「World」の間のスペースです。したがって、このコードでは、5 番目のインデックスより前の他の文字はすべて無視されます。2 番目の文字「o」のインデックスとして 7 が返されます。
Int IndexOf(String Str) メソッドの例
次の例では、部分文字列のインデックスを返す public intindexOf(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 intindexOf(String str, int fromIndex)です。これはpublic intindexOf(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
}
}
この例では、メソッドが最初の部分文字列の後の 5 番目のインデックスで作業を開始するように指定しました。21 は、for の 2 番目の部分文字列のインデックスです。最後に、文字列にない文字または部分文字列を渡すと、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
}
}
GO TO FULL VERSION