C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
LastIndexOf. This method searches from the rightmost index of a String. And both methods can start searching at a nonzero index, specified as an integer argument.
A simple example. This program uses indexOf with character arguments. The three indexOf calls locate indexes of the chars b, d, and z (which is not found).
Not found: For the letters "b" and "d," the indexes 1 and 3 are returned. But for "z," negative one is returned: no "z" is found.
Based on: Java 7 Java program that uses indexOf public class Program { public static void main(String[] args) { String line = "abcd"; int b = line.indexOf('b'); System.out.println(b); int d = line.indexOf('d'); System.out.println(d); int f = line.indexOf('z'); System.out.println(f); } } Output 1 3 -1
LastIndexOf. This method searches from the last char moving to the first char of the source string. So it locates first the final instance of a char or substring.
Note: As with indexOf, lastIndexOf can accept a String and a starting index as arguments. It mirrors indexOf in these ways.
Java program that uses lastIndexOf public class Program { public static void main(String[] args) { String line = "mom"; // Get index of last "m". int m = line.lastIndexOf('m'); System.out.println(m); } } Output 2
IndexOf, string. Finding a char within a String is useful. But finding a substring or multiple-character sequence is often more helpful. IndexOf (and lastIndexOf) supports this.
Also: We can pass a start index optionally to these methods to restrict our search field.
Java program that uses indexOf, string argument public class Program { public static void main(String[] args) { String line = "one two three"; // Get index of substring two. int index = line.indexOf("two"); System.out.println(index); } } Output 4
While-loop. We often use indexOf within a loop. Consider this program. It continues call indexOf as it advances the position. It finds all instances of the two-char string.
Java program that uses indexOf, while-loop public class Program { public static void main(String[] args) { String data = "abcabcabc"; // Keep looping until -1 encountered. int pos = 0; while ((pos = data.indexOf("ab", pos)) != -1) { // Print position and the substring starting at it. System.out.println(pos); System.out.println(data.substring(pos)); pos++; } } } Output 0 abcabcabc 3 abcabc 6 abc
Null argument error. We must be careful with indexOf when we might have null Strings. If we pass it a null argument, it will throw a NullPointerException.
Java program that causes NullPointerException public class Program { public static void main(String[] args) { String data = "welcome"; int j = data.indexOf(null); // Cannot do this. System.out.println(j); } } Output Exception in thread "main" java.lang.NullPointerException at java.lang.String.indexOf(Unknown Source) at java.lang.String.indexOf(Unknown Source) at program.Program.main(Program.java:7)
Between, before, after. We can use indexOf and lastIndexOf to extract parts of strings relative to other substrings. Some reusable methods are helpful.
Benchmark. In this test, we find that a call to indexOf is faster than a for-loop with calls to charAt. When possible, indexOf is preferable to for-loops. It locates chars faster.
Here: This program searches the "input" string for the lowercase "m." The first part uses indexOf. The second, for and charAt.
Java program that times indexOf, charAt public class Program { public static void main(String[] args) { String input = "abcdefghijklm"; long t1 = System.currentTimeMillis(); // Version 1: use indexOf to locate character. for (int i = 0; i < 10000000; i++) { int index = input.indexOf('m'); if (index < 0) { System.out.println("Error"); } } long t2 = System.currentTimeMillis(); // Version 2: use for, charAt to locate character. for (int i = 0; i < 10000000; i++) { int index = -1; for (int x = 0; x < input.length(); x++) { if (input.charAt(x) == 'm') { index = x; break; } } if (index < 0) { System.out.println("Error"); } } long t3 = System.currentTimeMillis(); // ... Times. System.out.println(t2 - t1); System.out.println(t3 - t2); } } Results 61 ms, indexOf 172 ms, for loop, charAt
Benchmark, lastIndexOf. Sometimes we can use lastIndexOf as an optimization. If a substring occurs 0 or 1 times in a String, indexOf and lastIndexOf return the same result.
And: If, based on our data, we find that the value occurs near the end more often, lastIndexOf is a faster yet equal method.
Here: The character "8" occurs near the end of a String. IndexOf requires more time to find it than lastIndexOf.
Java that times indexOf, lastIndexOf public class Program { public static void main(String[] args) { String input = "0123456789"; long t1 = System.currentTimeMillis(); // Version 1: use indexOf. for (int i = 0; i < 10000000; i++) { int index = input.indexOf('8'); if (index < 0) { System.out.println(false); } } long t2 = System.currentTimeMillis(); // Version 2: use lastIndexOf. for (int i = 0; i < 10000000; i++) { int index = input.lastIndexOf('8'); if (index < 0) { System.out.println(false); } } long t3 = System.currentTimeMillis(); // ... Times. System.out.println(t2 - t1); System.out.println(t3 - t2); } } Results 41 ms, indexOf 14 ms, lastIndexOf
String occurrence count. With indexOf and a while-loop we can count occurrences of one string within a source string. We introduce a countStringOccurrences method.
ArrayList. Strings have an indexOf method. But so do other classes like ArrayList. We use most indexOf methods in the same way: we test -1 to see if nothing was found.
With charAt, and a loop, we can search Strings without indexOf. But indexOf, a declarative method call, uses fewer statements. It may be (and often is) easier to read, debug and test.
Checking for negatives is a challenging part of using indexOf and lastIndexOf. We must handle -1 in a special case. Errors occur if we use an unchecked return value from indexOf.