String indexOf Examples
This page was last reviewed on Nov 15, 2023.
Dot Net Perls
IndexOf. A String in Java possibly contains a matching value. With indexOf, we can search it, from the start, for a match. This works with char and String arguments.
When no value is found, indexOf will return -1. To search from the end of a string, please use lastIndexOf. With indexOf we search from start to end.
String lastIndexOf
An example. This program uses indexOf with character arguments. The 3 indexOf calls in this program locate indexes of the individual chars "bdz."
Part 1 We try to locate a char in a string. The letter "b" returns the index 1, which is returned.
Part 2 Here we store the index of "d" in an int named "d." We often store the result of indexOf in an int.
Part 3 Here we try to find a char that does not exist in the string. For "z," negative one is returned.
public class Program { public static void main(String[] args) { String line = "abcd"; // Part 1: locate char in string. int b = line.indexOf('b'); System.out.println(b); // Part 2: locate another char at different index. int d = line.indexOf('d'); System.out.println(d); // Part 3: not found, error code. int z = line.indexOf('z'); System.out.println(z); } }
1 3 -1
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.
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); } }
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.
Detail When the 2-char string is found with indexOf, we print a substring of the remaining string.
String substring
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++; } } }
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.
public class Program { public static void main(String[] args) { String data = "welcome"; int j = data.indexOf(null); // Cannot do this. System.out.println(j); } }
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)
Contains. How can we search one String for another? With contains(), we pass in a String we want to find. The method returns true, if the String is found. It returns false if not.
Detail In my testing, the contains() method is case-sensitive. We can compare strings case-insensitively in many ways.
Also We can use a custom char-searching method. Or we could change a program to completely avoid the problem.
public class Program { public static void main(String[] args) { String name = "socrates"; String value1 = "soc"; String value2 = "rate"; String value3 = "plato"; // The name contains this value. if (name.contains(value1)) { System.out.println(value1); } // The name also contains this value. if (name.contains(value2)) { System.out.println(value2); } // The name does not contain this value. if (!name.contains(value3)) { System.out.println("no: " + value3); } } }
soc rate no: plato
Benchmark, indexOf. 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.
Version 1 This program searches the "input" string for the lowercase "m." This version uses indexOf.
Version 2 This code uses "for" and charAt. When the current character is the lowercase "m" it breaks out of the loop.
String charAt
Result It is faster to use indexOf in this benchmark. The loop could do more than one thing at once, which could help performance.
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); } }
61 ms, indexOf 172 ms, for loop, charAt
A review. With charAt, and a loop, we can search Strings without indexOf. But indexOf, a declarative method call, uses fewer statements. It may be easier to read, debug and test.
Dot Net Perls is a collection of tested code examples. Pages are continually updated to stay current, with code correctness a top priority.
Sam Allen is passionate about computer languages. In the past, his work has been recommended by Apple and Microsoft and he has studied computers at a selective university in the United States.
This page was last updated on Nov 15, 2023 (simplify).
© 2007-2024 Sam Allen.