在 Kotlin 中,ArrayList
、listOf
、arrayListOf
?和?mutableListOf
?是常用的集合創建方式,但它們在類型、可變性和使用場景上有明顯區別。以下是核心對比:
一、基本定義與類型
創建方式 | 類型 | 可變性 | 底層實現 |
---|---|---|---|
ArrayList<T>() | ArrayList<T> | 可變 | Java 的?ArrayList |
listOf() | List<T> (只讀接口) | 不可變 | Kotlin 內部實現 |
arrayListOf() | ArrayList<T> | 可變 | Java 的?ArrayList |
mutableListOf() | MutableList<T> (可變接口) | 可變 | 默認?ArrayList |
二、具體區別與示例
1.?ArrayList<T>()
- 本質:直接創建 Java 的?
ArrayList
?類實例。 - 特點:需顯式指定類型(除非通過初始化值推斷)。
- 示例:
val list = ArrayList<String>() // 創建空的可變列表 list.add("apple") list.add("banana")
2.?listOf()
- 本質:創建不可變的只讀列表(實現?
List
?接口)。 - 特點:
- 由 Kotlin 標準庫提供,優化了空列表和單元素列表的內存占用。
- 調用?
add()
、remove()
?等修改方法會拋出?UnsupportedOperationException
。
- 示例:
val immutableList = listOf("a", "b", "c") // 不可變列表 // immutableList.add("d") // 編譯錯誤:List 接口無 add() 方法
3.?arrayListOf()
- 本質:創建可變的?
ArrayList
?實例,是?ArrayList()
?的快捷方式。 - 特點:
- 無需顯式指定泛型類型(通過初始化值推斷)。
- 完全等價于?
ArrayList<T>().apply { addAll(...) }
。
- 示例:
val mutableList = arrayListOf("apple", "banana") // 可變列表 mutableList.add("cherry") // 合法
4.?mutableListOf()
- 本質:創建實現?
MutableList
?接口的可變列表,默認是?ArrayList
。 - 特點:
- 類型聲明為?
MutableList
,更抽象,允許未來更換實現(如切換為?LinkedList
)。 - 初始化語法更簡潔,支持默認參數。
- 類型聲明為?
- 示例:
val mutableList: MutableList<String> = mutableListOf("a", "b") // 可變列表 mutableList.add("c") // 合法
三、關鍵差異總結
1. 可變性
- 不可變:
listOf()
?創建的列表無法修改,適合作為只讀數據容器。 - 可變:
ArrayList()
、arrayListOf()
、mutableListOf()
?創建的列表支持增刪改操作。
2. 類型聲明
listOf()
?返回?List<T>
,僅包含只讀方法(如?get()
、size
)。mutableListOf()
?返回?MutableList<T>
,包含修改方法(如?add()
、remove()
)。ArrayList()
?和?arrayListOf()
?返回具體類?ArrayList<T>
,可調用?ArrayList
?特有的方法(如?trimToSize()
)。
3. 性能與場景
- 不可變列表:適合作為函數參數或返回值,保證數據不被修改,且內存占用優化。
- 可變列表:需要動態修改數據時使用,
arrayListOf()
?和?mutableListOf()
?按需選擇。
四、使用建議
- 優先使用?
listOf()
:當不需要修改列表時,不可變集合更安全。 - 優先使用?
mutableListOf()
:需要可變列表時,接口抽象性更好。 - 使用?
arrayListOf()
:需要調用?ArrayList
?特有方法時(如?ensureCapacity()
)。 - 避免直接?
ArrayList()
:除非需要顯式指定初始容量(如?ArrayList(100)
)。
五、常見誤區
- 混淆類型與可變性:
List
?是只讀接口,MutableList
?是可變接口,與具體實現(如?ArrayList
)無關。 - 錯誤轉換不可變列表:
val immutable = listOf("a", "b") val mutable = immutable as MutableList // 運行時拋出 ClassCastException!
正確做法:val mutable = mutableListOf<String>().apply { addAll(immutable) }
通過理解這些差異,可在 Kotlin 中更安全、高效地使用集合。