Toán tử logic
1. Các toán tử logic
Phần tiêu đề “1. Các toán tử logic”Java có ba toán tử logic dùng để kết hợp hoặc phủ định các biểu thức boolean:
| Toán tử | Ý nghĩa | Ví dụ |
|---|---|---|
&& |
AND - đúng khi cả hai vế đều đúng | a && b |
|| |
OR - đúng khi ít nhất một vế đúng | a || b |
! |
NOT - đảo ngược giá trị boolean | !a |
int age = 20;boolean hasLicense = true;
boolean canDrive = age >= 18 && hasLicense; // trueboolean isTeenOrSenior = age < 13 || age > 65; // falseboolean isNotAdult = !(age >= 18); // false2. Short-circuit evaluation (đánh giá ngắn mạch)
Phần tiêu đề “2. Short-circuit evaluation (đánh giá ngắn mạch)”&& và || đánh giá ngắn mạch: nếu kết quả đã xác định từ vế trái, Java sẽ không đánh giá vế phải nữa.
&&: nếu vế trái làfalse, kết quả chắc chắn làfalse→ bỏ qua vế phải||: nếu vế trái làtrue, kết quả chắc chắn làtrue→ bỏ qua vế phải
public class Main { static boolean expensiveCheck() { System.out.println("Đang gọi expensiveCheck()..."); return true; }
public static void main(String[] args) { int x = 0;
// x != 0 là false -> && ngắn mạch, expensiveCheck() KHÔNG được gọi if (x != 0 && expensiveCheck()) { System.out.println("Vào if"); } System.out.println("Xong"); // Chỉ in dòng này, không có "Đang gọi..." }}Nhờ short-circuit, ta có thể viết an toàn kiểu kiểm tra null trước khi dùng:
String name = null;if (name != null && name.length() > 0) { // an toàn: name.length() chỉ chạy khi name != null System.out.println(name);}3. So với toán tử bitwise & và |
Phần tiêu đề “3. So với toán tử bitwise & và |”Java cũng cho phép dùng & và | trên boolean (không chỉ trên số nguyên), nhưng chúng không short-circuit - cả hai vế luôn được đánh giá:
if (x != 0 & expensiveCheck()) { // expensiveCheck() VẪN được gọi dù x == 0 // ...}⚠️ Trong thực tế hầu như luôn dùng && và || cho biểu thức logic; &/| trên boolean rất hiếm khi cần thiết.
4. Định luật De Morgan
Phần tiêu đề “4. Định luật De Morgan”boolean a = true, b = false;
boolean r1 = !(a && b); // tương đương !a || !bboolean r2 = !(a || b); // tương đương !a && !bHữu ích khi cần đảo ngược một điều kiện phức tạp cho dễ đọc hơn.
Tổng kết
Phần tiêu đề “Tổng kết”&&,||,!là ba toán tử logic cơ bản, chỉ làm việc vớiboolean&&và||short-circuit: bỏ qua vế phải nếu kết quả đã xác định từ vế trái - tận dụng để tránh gọi hàm tốn kém hoặc tránh lỗi (như kiểm tranulltrước khi gọi phương thức)&và|cũng dùng được trên boolean nhưng không short-circuit - nên tránh dùng cho logic điều kiện thông thường