JVM hiện tại có hai loại mã byte chuyển đổi: LookupSwitch và TableSwitch.
Mỗi trường hợp trong một câu lệnh switch có một phần bù số nguyên, nếu các phần bù này liền kề nhau (hoặc hầu hết là liền nhau không có khoảng trống lớn) (trường hợp 0: trường hợp 1: trường hợp 2, v.v.), thì TableSwitch được sử dụng.
Nếu các hiệu số được dàn trải với khoảng trống lớn (trường hợp 0: trường hợp 400: trường hợp 93748:, v.v.), thì LookupSwitch được sử dụng.
Nói tóm lại, sự khác biệt là TableSwitch được thực hiện trong thời gian không đổi vì mỗi giá trị trong phạm vi các giá trị có thể được cung cấp một độ lệch mã byte cụ thể. Do đó, khi bạn cung cấp cho câu lệnh một phần bù là 3, nó sẽ biết nhảy lên trước 3 để tìm nhánh chính xác.
Công tắc tra cứu sử dụng tìm kiếm nhị phân để tìm nhánh mã chính xác. Điều này chạy trong thời gian O (log n), vẫn tốt, nhưng không phải là tốt nhất.
Để biết thêm thông tin về điều này, hãy xem tại đây: Sự khác biệt giữa LookupSwitch của JVM và TableSwitch?
Vì vậy, theo cách nào là nhanh nhất, hãy sử dụng phương pháp này: Nếu bạn có 3 trường hợp trở lên có giá trị liên tiếp hoặc gần như liên tiếp, hãy luôn sử dụng một công tắc.
Nếu bạn có 2 trường hợp, hãy sử dụng câu lệnh if.
Đối với bất kỳ tình huống nào khác, rất có thể chuyển đổi nhanh hơn, nhưng nó không được đảm bảo, vì tìm kiếm nhị phân trong LookupSwitch có thể gặp phải tình huống xấu.
Ngoài ra, hãy nhớ rằng JVM sẽ chạy tối ưu hóa JIT trên các câu lệnh if sẽ cố gắng đặt nhánh nóng nhất đầu tiên trong mã. Đây được gọi là "Dự đoán nhánh". Để biết thêm thông tin về điều này, hãy xem tại đây: https://dzone.com/articles/branch-prediction-in-java
Kinh nghiệm của bạn có thể khác nhau. Tôi không biết rằng JVM không chạy tối ưu hóa tương tự trên LookupSwitch, nhưng tôi đã học được cách tin tưởng vào các tối ưu hóa của JIT và không cố gắng vượt qua trình biên dịch.