Bỏ qua để đến nội dung

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; // true
boolean isTeenOrSenior = age < 13 || age > 65; // false
boolean isNotAdult = !(age >= 18); // false

2. Short-circuit evaluation (đánh giá ngắn mạch)

Phần tiêu đề “2. Short-circuit evaluation (đánh giá ngắn mạch)”

&&|| đá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);
}

Java cũng cho phép dùng &| 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 &&|| cho biểu thức logic; &/| trên boolean rất hiếm khi cần thiết.

boolean a = true, b = false;
boolean r1 = !(a && b); // tương đương !a || !b
boolean r2 = !(a || b); // tương đương !a && !b

Hữu ích khi cần đảo ngược một điều kiện phức tạp cho dễ đọc hơn.

  • &&, ||, ! là ba toán tử logic cơ bản, chỉ làm việc với boolean
  • &&|| 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 tra null trước khi gọi phương thức)
  • &| 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