Skip to Content
Kotlin📘 Ngôn ngữ Kotlin🔢 Giá trị và Kiểu dữ liệu

Giá trị và Kiểu dữ liệu trong Kotlin

🎯 Mục tiêu: Hiểu các kiểu dữ liệu cơ bản trong Kotlin, cách Kotlin tự suy luận kiểu, và sự khác biệt với ngôn ngữ khác.


💡 Khái niệm

Mọi giá trị trong Kotlin đều có kiểu dữ liệu (data type). Kotlin là ngôn ngữ statically typed - kiểu được xác định tại compile-time, nhưng bạn không cần khai báo nhờ type inference.

val name = "Bumbii" // Kotlin tự hiểu đây là String val age = 25 // Kotlin tự hiểu đây là Int val pi = 3.14 // Kotlin tự hiểu đây là Double val active = true // Kotlin tự hiểu đây là Boolean

📝 Các kiểu dữ liệu cơ bản

Số nguyên (Integer Types)

KiểuKích thướcPhạm vi
Byte8 bits-128 đến 127
Short16 bits-32,768 đến 32,767
Int32 bits-2³¹ đến 2³¹-1 (~±2.1 tỷ)
Long64 bits-2⁶³ đến 2⁶³-1
val byte: Byte = 127 val short: Short = 32000 val int = 1000000 // Mặc định là Int val long = 10000000000L // Thêm 'L' cho Long

Số thực (Floating-Point Types)

KiểuKích thướcĐộ chính xác
Float32 bits~6-7 chữ số thập phân
Double64 bits~15-16 chữ số thập phân
val float = 3.14f // Thêm 'f' cho Float val double = 3.14159265359 // Mặc định là Double

Ký tự và Chuỗi

val char: Char = 'K' // Một ký tự, dùng dấu nháy đơn val string: String = "Kotlin" // Chuỗi, dùng dấu nháy kép

Boolean

val isActive = true val hasPermission = false

🔍 Type Inference - Điểm mạnh của Kotlin

Kotlin tự động suy luận kiểu dữ liệu:

// Không cần khai báo kiểu val message = "Hello" // String val count = 42 // Int val price = 99.99 // Double val items = listOf(1, 2, 3) // List<Int> // Khai báo tường minh khi cần val amount: Long = 100 // Cần Long, không phải Int val rate: Float = 0.5f // Cần Float, không phải Double

[!TIP] Khi nào cần khai báo kiểu tường minh:

  • Khi muốn kiểu khác với mặc định (Long thay vì Int)
  • Khi khai báo biến chưa có giá trị
  • Khi muốn code rõ ràng hơn

📊 Literal Formats (Cách viết giá trị)

Số có thể dùng dấu gạch dưới

val oneMillion = 1_000_000 // Dễ đọc hơn 1000000 val creditCardNumber = 1234_5678_9012_3456L val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010

Hệ số khác

val decimal = 42 // Thập phân val hexadecimal = 0x2A // Thập lục phân (= 42) val binary = 0b101010 // Nhị phân (= 42)

⚠️ Điểm khác biệt quan trọng với Java

1. Không có implicit widening

val intValue: Int = 100 // ❌ Lỗi trong Kotlin // val longValue: Long = intValue // ✅ Phải convert tường minh val longValue: Long = intValue.toLong()

2. Mọi thứ là object

Trong Kotlin, không có primitive types như Java. Mọi thứ đều là object:

val number = 42 println(number.toString()) // OK! Int có methods println(number.plus(8)) // 50 println(number.coerceIn(0, 40)) // 40 (giới hạn trong khoảng)

[!NOTE] Kotlin compiler tự động tối ưu thành primitives khi có thể, nên không ảnh hưởng hiệu năng.

3. Nullable types

val nonNull: Int = 42 // Không thể null val nullable: Int? = null // Có thể null // Sẽ học chi tiết ở bài Null Safety

🎯 Type Conversion (Chuyển đổi kiểu)

Kotlin yêu cầu chuyển đổi tường minh:

val intValue = 100 val longValue = intValue.toLong() val doubleValue = intValue.toDouble() val stringValue = intValue.toString() // Các method chuyển đổi val byte: Byte = intValue.toByte() val short: Short = intValue.toShort() val float: Float = intValue.toFloat() val char: Char = intValue.toChar()

Parse từ String

val strNumber = "42" val number = strNumber.toInt() // 42 val safeNumber = strNumber.toIntOrNull() // 42 hoặc null val invalidStr = "abc" // val error = invalidStr.toInt() // ❌ NumberFormatException! val safe = invalidStr.toIntOrNull() // null (an toàn)

📐 Any, Unit, và Nothing

Any - Cha của tất cả

val anything: Any = "Hello" val alsoAnything: Any = 42 fun printAnything(value: Any) { println(value) }

Unit - Tương đương void

fun printMessage(): Unit { println("Hello") } // Có thể bỏ qua Unit fun printMessage() { println("Hello") }

Nothing - Không bao giờ return

fun fail(message: String): Nothing { throw IllegalStateException(message) }

🛠️ Thực hành

Bài tập 1: Xác định kiểu dữ liệu

fun main() { val a = 42 // Kiểu gì? val b = 42L // Kiểu gì? val c = 3.14 // Kiểu gì? val d = 3.14f // Kiểu gì? val e = 'K' // Kiểu gì? val f = "Kotlin" // Kiểu gì? val g = true // Kiểu gì? val h = listOf(1, 2) // Kiểu gì? }

Đáp án:

  • aInt
  • bLong
  • cDouble
  • dFloat
  • eChar
  • fString
  • gBoolean
  • hList<Int>

Bài tập 2: Chuyển đổi kiểu

fun main() { val userInput = "25" // TODO: Chuyển thành Int và tính tuổi sau 5 năm // TODO: Xử lý trường hợp input không hợp lệ }

Lời giải:

fun main() { val userInput = "25" val age = userInput.toIntOrNull() if (age != null) { val futureAge = age + 5 println("Sau 5 năm bạn sẽ $futureAge tuổi") } else { println("Tuổi không hợp lệ") } }

📱 Trong Android

// Parse data từ Intent extras val userId = intent.getIntExtra("USER_ID", -1) val userName = intent.getStringExtra("USER_NAME") ?: "Unknown" // Parse từ SharedPreferences val settings = getSharedPreferences("settings", MODE_PRIVATE) val notificationEnabled = settings.getBoolean("notifications", true) val lastSync = settings.getLong("last_sync", 0L)

🧠 Kiểu dữ liệu nâng cao (Preview)

Kotlin còn có:

KiểuMô tảSẽ học ở
Array<T>MảngBài Collections
List<T>Danh sáchBài Collections
Map<K,V>Từ điểnBài Collections
Data classClass chứa dataBài OOP
Enum classTập hợp hằng sốBài OOP
Sealed classClass đóngBài OOP

✅ Checklist - Tự kiểm tra

Sau bài học này, bạn có thể:

  • Liệt kê 8 kiểu dữ liệu cơ bản trong Kotlin
  • Hiểu cách Kotlin tự suy luận kiểu (type inference)
  • Phân biệt Int vs Long, Float vs Double
  • Sử dụng underscore trong số lớn (1_000_000)
  • Chuyển đổi kiểu với toInt(), toLong(), toString(), etc.
  • Sử dụng toIntOrNull() để parse an toàn

Tiếp theo: Kiểu dữ liệu Số

Last updated on