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

Toán tử quan hệ (so sánh)

Toán tử Ý nghĩa Ví dụ
== Bằng 5 == 5true
!= Khác 5 != 3true
> Lớn hơn 5 > 3true
< Nhỏ hơn 5 < 3false
>= Lớn hơn hoặc bằng 5 >= 5true
<= Nhỏ hơn hoặc bằng 5 <= 3false

Kết quả của các toán tử này luôn là boolean:

int age = 20;
boolean isAdult = age >= 18; // true
System.out.println(isAdult);

2. So sánh trên kiểu nguyên thủy (primitive)

Phần tiêu đề “2. So sánh trên kiểu nguyên thủy (primitive)”

Với các kiểu nguyên thủy (int, double, char…), == so sánh giá trị một cách trực tiếp và hoạt động đúng như mong đợi:

int a = 5, b = 5;
System.out.println(a == b); // true - so sánh giá trị

3. ⚠️ So sánh trên object (bao gồm String)

Phần tiêu đề “3. ⚠️ So sánh trên object (bao gồm String)”

Với object (bao gồm String, Integer, hay bất kỳ class nào), == so sánh xem hai biến có cùng trỏ đến một object trong bộ nhớ hay không, chứ không so sánh nội dung:

String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false! Hai object khác nhau, dù nội dung giống nhau
System.out.println(s1.equals(s2)); // true - so sánh đúng nội dung

Chủ đề này có nhiều điểm bất ngờ (String pool, Integer caching…) - xem chi tiết ở bài “What the Java” dành riêng về so sánh chuỗi.

Khác với Python, Java không hỗ trợ so sánh liên tiếp kiểu toán học như a < b < c:

int a = 1, b = 2, c = 3;
// if (a < b < c) { ... } // LỖI BIÊN DỊCH!

Lý do: a < b cho ra kết quả boolean, và Java không cho phép so sánh boolean < int (boolean không chuyển đổi được sang số). Phải viết tường minh:

if (a < b && b < c) { // Đúng
System.out.println("a < b < c");
}
  • Toán tử quan hệ trả về boolean: ==, !=, >, <, >=, <=
  • Trên kiểu nguyên thủy, == so sánh giá trị
  • Trên object (kể cả String), == so sánh tham chiếu (địa chỉ), không phải nội dung - dùng .equals() để so sánh nội dung
  • Java không cho phép viết so sánh liên tiếp a < b < c như trong toán học