Skip to Content
Kotlin📘 Ngôn ngữ Kotlin⚖️ Toán tử Quan hệ/So sánh

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ĩaVí dụKết quả
==Bằng5 == 5true
!=Khác5 != 3true
>Lớn hơn5 > 3true
<Nhỏ hơn3 < 5true
>=Lớn hơn hoặc bằng5 >= 5true
<=Nhỏ hơn hoặc bằng3 <= 3true
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) // false

So 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)) // true

Referential 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) // false

Regular 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 Comparable cho 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