Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

ความแตกต่างระหว่าง List และ Array ใน Kotlin

ภาพรวม

List และ Array เป็น Collection หลักใน Kotlin ทั้งคู่จัดเก็บข้อมูลในหน่วยความจำแบบ Sequential แต่มีความแตกต่างสำคัญหลายประการ

ตารางเปรียบเทียบ

ลักษณะArrayList
ImplementationArray<T> ClassList<T> / MutableList<T> Interface
Mutability (Reference)Immutable Reference (Size คงที่)List = Immutable, MutableList = Mutable
Element Mutationได้ (arr[0] = x)List: ไม่ได้, MutableList: ได้
SizeFixed (ไม่เปลี่ยนแปลงได้)MutableList: เพิ่ม/ลดได้ (add, remove)
Performanceเร็วกว่า, Memory Efficient (Primitive Arrays)Flexible, Overhead เล็กน้อย
Primitive Supportมี Specialized: IntArray, DoubleArray, etc.ไม่มี (ใช้ Wrapper/Boxed)
CovarianceInvariant (Array ≠ Array)Covariant (List เป็น List)
SyntaxarrayOf(), 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