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"));  // false

Using 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"));  // 0

Practical 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);  // true

Use 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