String Comparison
equals(), equalsIgnoreCase(), compareTo()
Interview Relevant: == vs equals() is a classic interview question
6 min read
Comparing Strings in Java
String comparison is a critical topic. Understanding the difference between reference comparison (==) and content comparison (equals()) is essential.
Comparison Methods
| Method | Purpose |
|---|---|
| == | Compares references (memory addresses) |
| equals() | Compares content (case-sensitive) |
| equalsIgnoreCase() | Compares content (case-insensitive) |
| compareTo() | Lexicographic comparison (for sorting) |
ā ļø Golden Rule: NEVER use == to compare string contents! Always use equals() or equalsIgnoreCase().
Code Examples
Critical difference between == and equals()
java
1// == vs equals() - The critical difference
2String s1 = "Hello";
3String s2 = "Hello";
4String s3 = new String("Hello");
5String s4 = new String("Hello");
6
7// == compares REFERENCES (memory addresses)
8System.out.println(s1 == s2); // true (same pool reference)
9System.out.println(s1 == s3); // false (different objects)
10System.out.println(s3 == s4); // false (different objects)
11
12// equals() compares CONTENT
13System.out.println(s1.equals(s2)); // true
14System.out.println(s1.equals(s3)); // true
15System.out.println(s3.equals(s4)); // true
16
17// Why == sometimes works (String Pool)
18String a = "Java";
19String b = "Java";
20System.out.println(a == b); // true (both from pool - DON'T RELY ON THIS!)Case-insensitive and null-safe comparison
java
1// equalsIgnoreCase() for case-insensitive comparison
2String s1 = "Hello";
3String s2 = "HELLO";
4String s3 = "hello";
5
6System.out.println(s1.equals(s2)); // false
7System.out.println(s1.equalsIgnoreCase(s2)); // true
8System.out.println(s1.equalsIgnoreCase(s3)); // true
9
10// Practical usage: User input comparison
11String userInput = "YES";
12if (userInput.equalsIgnoreCase("yes")) {
13 System.out.println("User agreed!");
14}
15
16// Safe comparison with null check
17String maybeNull = null;
18
19// WRONG: Will throw NullPointerException!
20// if (maybeNull.equals("test")) { }
21
22// CORRECT: Put literal first
23if ("test".equals(maybeNull)) {
24 System.out.println("Match!");
25}
26
27// Or use Objects.equals() (Java 7+)
28System.out.println(Objects.equals(maybeNull, "test")); // falseUsing compareTo() for ordering
java
1// compareTo() for lexicographic ordering
2String s1 = "Apple";
3String s2 = "Banana";
4String s3 = "Apple";
5
6// Returns:
7// Negative: s1 comes BEFORE argument
8// Zero: Strings are EQUAL
9// Positive: s1 comes AFTER argument
10
11System.out.println(s1.compareTo(s2)); // Negative (-1) Apple < Banana
12System.out.println(s2.compareTo(s1)); // Positive (1) Banana > Apple
13System.out.println(s1.compareTo(s3)); // 0 (equal)
14
15// Used for sorting
16String[] names = {"Charlie", "Alice", "Bob"};
17Arrays.sort(names); // Uses compareTo internally
18// Result: ["Alice", "Bob", "Charlie"]
19
20// Case-insensitive comparison
21System.out.println("apple".compareTo("Apple")); // Positive (lowercase > uppercase)
22System.out.println("apple".compareToIgnoreCase("Apple")); // 0Practical comparison patterns
java
1// Practical comparison patterns
2
3// 1. Checking equality with null safety
4public static boolean safeEquals(String s1, String s2) {
5 if (s1 == null) return s2 == null;
6 return s1.equals(s2);
7}
8
9// 2. Comparing with multiple values
10String input = "red";
11if (input.equals("red") || input.equals("blue") || input.equals("green")) {
12 System.out.println("Valid color!");
13}
14
15// Better with Set
16Set<String> validColors = Set.of("red", "blue", "green");
17if (validColors.contains(input.toLowerCase())) {
18 System.out.println("Valid color!");
19}
20
21// 3. Prefix/suffix checking
22String filename = "report.pdf";
23if (filename.endsWith(".pdf")) {
24 System.out.println("PDF file");
25}
26if (filename.startsWith("report")) {
27 System.out.println("It's a report");
28}
29
30// 4. Region comparison
31String s = "HelloWorld";
32boolean match = s.regionMatches(5, "World", 0, 5); // trueUse Cases
- User input validation
- Password comparison (use secure methods for real passwords!)
- Sorting lists of strings
- File type checking (extensions)
- Configuration value matching
- Search functionality
Common Mistakes to Avoid
- Using == for content comparison
- Calling equals() on null string
- Forgetting case sensitivity
- Not understanding compareTo() return values
- Assuming == works because of String Pool
- Not handling null cases properly