ภาพรวม
List และ Array เป็น Collection หลักใน Kotlin ทั้งคู่จัดเก็บข้อมูลในหน่วยความจำแบบ Sequential แต่มีความแตกต่างสำคัญหลายประการ
ตารางเปรียบเทียบ
| ลักษณะ | Array | List |
|---|---|---|
| Implementation | Array<T> Class | List<T> / MutableList<T> Interface |
| Mutability (Reference) | Immutable Reference (Size คงที่) | List = Immutable, MutableList = Mutable |
| Element Mutation | ได้ (arr[0] = x) | List: ไม่ได้, MutableList: ได้ |
| Size | Fixed (ไม่เปลี่ยนแปลงได้) | MutableList: เพิ่ม/ลดได้ (add, remove) |
| Performance | เร็วกว่า, Memory Efficient (Primitive Arrays) | Flexible, Overhead เล็กน้อย |
| Primitive Support | มี Specialized: IntArray, DoubleArray, etc. | ไม่มี (ใช้ Wrapper/Boxed) |
| Covariance | Invariant (Array ≠ Array) | Covariant (List เป็น List) |
| Syntax | arrayOf(), Array() | listOf(), mutableListOf() |
ตัวอย่างการใช้งาน
Array - ขนาดคงที่, Mutable Elements
fun main() {
val arr = arrayOf(1, 2, 3)
arr[0] = 10 // ✅ OK - เปลี่ยน Element ได้
// arr.add(4) // ❌ Error - ไม่มี add()
// arr.size = 4 // ❌ Error - Size คงที่
// Primitive Array
val intArr = intArrayOf(1, 2, 3) // IntArray (ไม่ใช่ Array)
intArr[0] = 100
}
List - Immutable, Dynamic Size (MutableList)
fun main() {
// Immutable List
val list = listOf("A", "B", "C")
// list[0] = "X" // ❌ Error - val + Immutable List
// list.add("D") // ❌ Error - No add()
// Mutable List
val mutable = mutableListOf("A", "B", "C")
mutable[0] = "X" // ✅ OK
mutable.add("D") // ✅ OK - Size เพิ่ม
mutable.remove("B") // ✅ OK - Size ลด
}
การแปลงระหว่างกัน
fun main() {
val list = listOf(1, 2, 3)
val array = list.toTypedArray() // List -> Array
val array2 = arrayOf(1, 2, 3)
val list2 = array2.toList() // Array -> List (Immutable)
val mutableList2 = array2.toMutableList() // Array -> MutableList
}
Primitive Arrays - ประหยัด Memory
fun main() {
// Boxing Overhead: Array = Array of Object (Integer)
val boxed = arrayOf(1, 2, 3) // Array -> Object[]
// No Boxing: IntArray = int[] (Primitive)
val primitive = intArrayOf(1, 2, 3) // IntArray -> int[]
// Performance Critical ใช้ Primitive Arrays
val large = IntArray(1_000_000) { it } // 4 MB vs ~16 MB
}
แนวทางเลือกใช้
- Array / Primitive Array: Performance Critical, Fixed Size, Low-level, Interop Java Array
- List (Immutable): Default Choice, Functional Style, Thread Safety, Read-only Data
- MutableList: ต้องเพิ่ม/ลบ Element บ่อย, Dynamic Size
- Sequence: Large/Infinite Collection, Lazy Evaluation
สรุป
Array = Fixed Size, Mutable Elements, Primitive Support, Fast
List = Interface, Immutable Default, Dynamic Size (via MutableList), Covariant, Idiomatic Kotlin