Toán tử Quan hệ/So sánh trong Kotlin
🎯 Mục tiêu: Nắm vững các toán tử so sánh trong Kotlin - nền tảng cho điều kiện và logic.
💡 Tổng quan
Toán tử so sánh dùng để so sánh hai giá trị, kết quả luôn là Boolean (true hoặc false).
| Toán tử | Ý nghĩa | Ví dụ | Kết quả |
|---|---|---|---|
== | Bằng | 5 == 5 | true |
!= | Khác | 5 != 3 | true |
> | Lớn hơn | 5 > 3 | true |
< | Nhỏ hơn | 3 < 5 | true |
>= | Lớn hơn hoặc bằng | 5 >= 5 | true |
<= | Nhỏ hơn hoặc bằng | 3 <= 3 | true |
val a = 10
val b = 5
println(a == b) // false
println(a != b) // true
println(a > b) // true
println(a >= 10) // true📝 So sánh số
val x = 10
val y = 20
println(x < y) // true
println(x > y) // false
println(x == 10) // true
println(y != 20) // falseSo sánh với các kiểu số khác nhau
val intVal = 10
val longVal = 10L
val doubleVal = 10.0
// So sánh giá trị, tự động convert
println(intVal == longVal.toInt()) // true
println(intVal.toDouble() == doubleVal) // true
// Cẩn thận với floating point!
println(0.1 + 0.2 == 0.3) // false! (do precision)🔤 So sánh String
Structural Equality (==)
So sánh nội dung:
val s1 = "Kotlin"
val s2 = "Kotlin"
val s3 = "kotlin"
println(s1 == s2) // true (cùng nội dung)
println(s1 == s3) // false (khác case)
// Không phân biệt hoa/thường
println(s1.equals(s3, ignoreCase = true)) // trueReferential Equality (===)
So sánh reference (cùng object trong memory):
val a = "Kotlin"
val b = "Kotlin"
val c = String("Kotlin".toCharArray())
println(a == b) // true (cùng nội dung)
println(a === b) // true (cùng reference - string pool)
println(a === c) // false (khác reference)[!NOTE] Trong thực tế, bạn hầu như luôn dùng
==(structural equality). Chỉ dùng===khi cần kiểm tra chính xác cùng object.
📊 So sánh với compareTo
compareTo() trả về:
- Số âm: Nhỏ hơn
- 0: Bằng
- Số dương: Lớn hơn
val a = "apple"
val b = "banana"
println(a.compareTo(b)) // -1 (a < b theo alphabet)
println(a < b) // true
println(a > b) // false🎯 Toán tử in - Kiểm tra phạm vi
val age = 25
// Kiểm tra trong range
println(age in 18..65) // true (18 <= age <= 65)
println(age !in 0..17) // true (không trong 0-17)
// Với collections
val fruits = listOf("apple", "banana", "orange")
println("apple" in fruits) // true
println("mango" in fruits) // false⚖️ So sánh Objects
Data class - tự động implement equals
data class User(val name: String, val age: Int)
val user1 = User("Alice", 25)
val user2 = User("Alice", 25)
val user3 = User("Bob", 30)
println(user1 == user2) // true (cùng giá trị)
println(user1 === user2) // false (khác reference)
println(user1 == user3) // falseRegular class - so sánh reference mặc định
class Person(val name: String)
val p1 = Person("Alice")
val p2 = Person("Alice")
println(p1 == p2) // false! (khác reference)
println(p1 === p2) // false🔍 Comparable interface
Implement Comparable để dùng với <, >, etc:
data class Product(val name: String, val price: Double) : Comparable<Product> {
override fun compareTo(other: Product): Int {
return this.price.compareTo(other.price)
}
}
fun main() {
val phone = Product("Phone", 15000000.0)
val laptop = Product("Laptop", 25000000.0)
println(phone < laptop) // true
println(phone > laptop) // false
println(phone == laptop) // false
}🛠️ Thực hành
Bài tập 1: Kiểm tra điều kiện đăng ký
fun main() {
val age = 17
val hasParentConsent = true
// TODO: In ra có được đăng ký không
// Điều kiện: >= 18 tuổi HOẶC < 18 có sự đồng ý của phụ huynh
}Lời giải:
fun main() {
val age = 17
val hasParentConsent = true
val canRegister = age >= 18 || (age < 18 && hasParentConsent)
println("Tuổi: $age")
println("Có đồng ý của phụ huynh: $hasParentConsent")
println("Được đăng ký: $canRegister") // true
}Bài tập 2: So sánh điểm
fun main() {
val scores = listOf(85, 92, 78, 65, 98)
val passingScore = 75
// TODO: Đếm số lượng đạt và không đạt
}Lời giải:
fun main() {
val scores = listOf(85, 92, 78, 65, 98)
val passingScore = 75
val passed = scores.count { it >= passingScore }
val failed = scores.count { it < passingScore }
println("Đạt: $passed") // 4
println("Không đạt: $failed") // 1
}Bài tập 3: Xếp loại học lực
fun main() {
val score = 85.5
// TODO: Xếp loại:
// >= 90: Xuất sắc
// >= 80: Giỏi
// >= 70: Khá
// >= 50: Trung bình
// < 50: Yếu
}Lời giải:
fun main() {
val score = 85.5
val grade = when {
score >= 90 -> "Xuất sắc"
score >= 80 -> "Giỏi"
score >= 70 -> "Khá"
score >= 50 -> "Trung bình"
else -> "Yếu"
}
println("Điểm: $score - Xếp loại: $grade")
// Output: Điểm: 85.5 - Xếp loại: Giỏi
}📱 Trong Android
// Kiểm tra API level
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Sử dụng feature cho Android 8.0+
}
// So sánh versions
val currentVersion = "2.1.0"
val minVersion = "2.0.0"
if (currentVersion >= minVersion) {
// OK để tiếp tục
}
// Filter list
val users = listOf(
User("Alice", 25),
User("Bob", 17),
User("Charlie", 30)
)
val adults = users.filter { it.age >= 18 }⚠️ Lưu ý quan trọng
[!WARNING] So sánh Float/Double:
val a = 0.1 + 0.2 val b = 0.3 println(a == b) // false! (do floating-point precision) // Dùng epsilon comparison val epsilon = 0.0001 println(kotlin.math.abs(a - b) < epsilon) // true
[!TIP] Sử dụng
==thay vì.equals():// Kotlin val same = s1 == s2 // Thay vì (Java style) val same = s1.equals(s2)
✅ Checklist - Tự kiểm tra
Sau bài học này, bạn có thể:
- Sử dụng 6 toán tử so sánh:
==,!=,<,>,<=,>= - Phân biệt
==(structural equality) và===(referential equality) - So sánh String không phân biệt hoa/thường với
equals(ignoreCase = true) - Sử dụng
inđể kiểm tra phạm vi - Implement
Comparablecho custom class - Cẩn thận khi so sánh floating-point numbers
Tiếp theo: Cấu trúc rẽ nhánh (if-else)
Last updated on