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.
This program uses indexOf
with character arguments. The 3 indexOf
calls in this program locate indexes of the individual chars "bdz."
char
in a string
. The letter "b" returns the index 1, which is returned.int
named "d." We often store the result of indexOf
in an int
.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.
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); } }4
While
-loopWe 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
.
char
string
is found with indexOf
, we print a substring of the remaining string
.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
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.
contains()
method is case-sensitive. We can compare strings case-insensitively in many ways.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
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.
string
for the lowercase "m." This version uses indexOf
.charAt
. When the current character is the lowercase "m" it breaks out of the loop.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
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.