3 回答

TA貢獻1820條經(jīng)驗 獲得超9個贊
數(shù)組和列表(由List<T>和表示其子類型MutableList<T>)有很多差異,這是最重要的:
Array<T>是具有已知實現(xiàn)的類:它是存儲項目的順序固定大小的內(nèi)存區(qū)域(在JVM上,它由Java array表示)。
List<T>并且MutableList<T>是具有不同的實現(xiàn)接口:ArrayList<T>,LinkedList<T>列表的邏輯在具體的實施,例如,定義等。存儲器表示和操作索引在一個LinkedList<T>穿過鏈接和需要O(n)的時間而ArrayList<T>存儲其在動態(tài)分配的數(shù)組項。
val list1: List<Int> = LinkedList<Int>()
val list2: List<Int> = ArrayList<Int>()
Array<T>是可變的(可以通過對其的任何引用進行更改),但是List<T>沒有修改方法(它是只讀視圖MutableList<T>或不可變列表實現(xiàn))。
val a = arrayOf(1, 2, 3)
a[0] = a[1] // OK
val l = listOf(1, 2, 3)
l[0] = l[1] // doesn't compile
val m = mutableListOf(1, 2, 3)
m[0] = m[1] // OK
數(shù)組具有固定大小,無法擴展或縮小保留的標(biāo)識(您需要復(fù)制數(shù)組以調(diào)整其大小)。對于列表,MutableList<T>具有add和remove功能,以便可以增加和減小其大小。
val a = arrayOf(1, 2, 3)
println(a.size) // will always be 3 for this array
val l = mutableListOf(1, 2, 3)
l.add(4)
println(l.size) // 4
Array<T>在T(Array<Int>not Array<Number>)上是不變的,與相同MutableList<T>,但是List<T>是協(xié)變(List<Int>is List<Number>)。
val a: Array<Number> = Array<Int>(0) { 0 } // won't compile
val l: List<Number> = listOf(1, 2, 3) // OK
陣列被用于原語優(yōu)化:有分離IntArray,DoubleArray,CharArray等,它們被映射到Java原始陣列(int[],double[],char[]),不盒裝那些(Array<Int>被映射到Java的Integer[])。列表通常沒有針對基元進行優(yōu)化的實現(xiàn),盡管某些庫(JDK外部)提供了基元優(yōu)化的列表。
List<T>并且MutableList<T>是映射類型,并且在Java互操作性方面具有特殊行為(List<T>從Kotlin中將Java 視為List<T>或MutableList<T>)。數(shù)組也被映射,但是它們具有Java互操作性的其他規(guī)則。
注釋中使用了某些數(shù)組類型(原始數(shù)組Array<String>和帶有enum class條目的數(shù)組),并且注釋具有特殊的數(shù)組文字語法。列表和其他集合不能在注釋中使用。
至于用法,優(yōu)良作法是在代碼的性能關(guān)鍵部分以外的任何地方都使用列表而不是數(shù)組,其理由與Java相同。

TA貢獻1884條經(jīng)驗 獲得超4個贊
與用法方面的主要區(qū)別在于,數(shù)組具有固定的大小,同時(Mutable)List可以動態(tài)調(diào)整其大小。而且Array是可變的而List不是可變的。
此外,kotlin.collections.List還通過來實現(xiàn)一個接口java.util.ArrayList。kotlin.collections.MutableList當(dāng)需要收集允許進行項目修改的集合時,也可以使用它。
在jvm級別Array上,由arrays表示。List另一方面,java.util.List由于Java中沒有不可變的集合等效項,因此用表示。

TA貢獻1799條經(jīng)驗 獲得超9個贊
**一般,列表和數(shù)組類型之間的區(qū)別是:**
List<...>:
僅供閱讀。
Array<...>:
您可以修改它,或添加一些東西。
- 3 回答
- 0 關(guān)注
- 1857 瀏覽
添加回答
舉報