Java.Core.Why if-else is slower ?

Why is if-else Slower than switch in Java (When Using Strings)?

The performance difference between if-else and switch comes down to how Java processes conditions:

  1. if-else checks each condition sequentially (one by one).
  2. switch uses a lookup mechanism (hashing and jump tables), which is optimized for performance.

1. if-else Evaluates Conditions One by One

When using if-else, Java must check each condition separately until it finds a match.

Example: if-else String Comparison

public class IfElseExample {
    public static void main(String[] args) {
        String day = "Friday";

        if (day.equals("Monday")) {
            System.out.println("Start of the week!");
        } else if (day.equals("Tuesday")) {
            System.out.println("Regular workday.");
        } else if (day.equals("Wednesday")) {
            System.out.println("Midweek.");
        } else if (day.equals("Thursday")) {
            System.out.println("Almost there.");
        } else if (day.equals("Friday")) {
            System.out.println("Weekend is coming!");
        } else {
            System.out.println("Weekend!");
        }
    }
}

How Java Executes This:

  1. First, it checks day.equals("Monday") → false
  2. Then, it checks day.equals("Tuesday") → false
  3. Then, it checks day.equals("Wednesday") → false
  4. Then, it checks day.equals("Thursday") → false
  5. Finally, it checks day.equals("Friday") → true, so it executes that block.

🚨 Problem: If the matching case is at the end, Java must evaluate multiple conditions, making execution slower.


2. switch Uses a More Optimized Approach

When using a switch statement, Java does not check each case sequentially. Instead:

  1. It computes the hashCode() of the string.
  2. It uses a lookup mechanism (jump table or hash table) to find the matching case directly.

Example: switch String Comparison

public class SwitchExample {
    public static void main(String[] args) {
        String day = "Friday";

        switch (day) {
            case "Monday":
                System.out.println("Start of the week!");
                break;
            case "Tuesday":
                System.out.println("Regular workday.");
                break;
            case "Wednesday":
                System.out.println("Midweek.");
                break;
            case "Thursday":
                System.out.println("Almost there.");
                break;
            case "Friday":
                System.out.println("Weekend is coming!");
                break;
            default:
                System.out.println("Weekend!");
        }
    }
}

How Java Executes This:

  1. Computes hashCode() of day (“Friday”).
  2. Uses a precomputed lookup table to jump directly to the "Friday" case.
  3. Executes that case without checking previous cases.

Benefit: switch finds the correct case instantly, instead of checking conditions sequentially.


3. Performance Comparison: if-else vs switch

Let’s benchmark if-else and switch to see which one is faster.

Benchmark Code

public class PerformanceTest {
    public static void main(String[] args) {
        String testDay = "Friday";
        int iterations = 1_000_000;

        long start, end;

        // Measure time for if-else
        start = System.nanoTime();
        for (int i = 0; i < iterations; i++) {
            ifElseTest(testDay);
        }
        end = System.nanoTime();
        System.out.println("if-else time: " + (end - start) / 1_000_000.0 + " ms");

        // Measure time for switch
        start = System.nanoTime();
        for (int i = 0; i < iterations; i++) {
            switchTest(testDay);
        }
        end = System.nanoTime();
        System.out.println("switch time: " + (end - start) / 1_000_000.0 + " ms");
    }

    static void ifElseTest(String day) {
        if (day.equals("Monday")) {} 
        else if (day.equals("Tuesday")) {} 
        else if (day.equals("Wednesday")) {} 
        else if (day.equals("Thursday")) {} 
        else if (day.equals("Friday")) {} 
        else {}
    }

    static void switchTest(String day) {
        switch (day) {
            case "Monday": break;
            case "Tuesday": break;
            case "Wednesday": break;
            case "Thursday": break;
            case "Friday": break;
            default: break;
        }
    }
}

pected Results (Typical Output)

if-else time: 25.3 ms
switch time: 7.8 ms

switch is ~3 times faster than if-else because of its lookup mechanism!


4. Why Is switch Faster?

Switch Uses Hashing (Optimized Lookup)

  • Computes hashCode() of the string once.
  • Jumps directly to the case using a lookup table (instead of sequential checks).

If-Else Checks Each Condition One by One

  • Needs multiple .equals() calls.
  • Longer chains take more time (e.g., if the matching case is at the bottom).

5. When Should You Use switch vs. if-else?

FeatureUse switchUse if-else
Performance✅ Faster (optimized lookup)❌ Slower (checks sequentially)
Number of Conditions✅ Best for many cases (3+)✅ Good for few conditions (1-2)
Readability✅ Easier to read with multiple cases❌ Harder to read with many else if
Complex Conditions❌ Only works with exact matches✅ Supports complex boolean logic

Use switch for many predefined values (like days, commands, menu options).
Use if-else when conditions are more complex (range checks, combined conditions).


Conclusion

  • switch is faster than if-else for many cases because it uses hash-based lookups.
  • if-else checks each condition sequentially, making it slower as the number of cases grows.
  • For best performance, prefer switch when comparing many string values.
This entry was posted in Без рубрики. Bookmark the permalink.

Leave a Reply

Your email address will not be published.