[英]Difference between List and Array types in Kotlin
List
和Array
類型有什么區別?
似乎可以對它們進行相同的操作(循環、過濾器表達式等),在行為或用法上有什么不同嗎?
val names1 = listOf("Joe","Ben","Thomas")
val names2 = arrayOf("Joe","Ben","Thomas")
for (name in names1)
println(name)
for (name in names2)
println(name)
數組和列表(由List<T>
及其子類型MutableList<T>
)有很多不同之處,以下是最重要的:
Array<T>
是一個具有已知實現的類:它是一個連續的固定大小的內存區域來存儲項目(在 JVM 上它由Java array表示)。
List<T>
和MutableList<T>
是接口,它們有不同的實現: ArrayList<T>
, LinkedList<T>
等。 列表的內存表示和操作邏輯在具體實現中定義,例如LinkedList<T>
索引經過鏈接並花費 O(n) 時間,而ArrayList<T>
將其項目存儲在動態分配的數組中。
val list1: List<Int> = LinkedList<Int>() val list2: List<Int> = ArrayList<Int>()
Array<T>
是可變的(可以通過對它的任何引用進行更改),但List<T>
沒有修改方法(它是MutableList<T>
只讀視圖或不可變列表實現)。
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
數組具有固定大小,不能擴展或收縮保留標識(您需要復制數組以調整其大小)。 對於列表, 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>
不是Array<Number>
),對於MutableList<T>
,但List<T>
是協變的( List<Int>
是List<Number>
)。
val a: Array<Number> = Array<Int>(0) { 0 } // won't compile val l: List<Number> = listOf(1, 2, 3) // OK
陣列被用於原語優化:有單獨IntArray
, DoubleArray
, CharArray
等,其被映射到Java原始陣列( int[]
double[]
char[]
不盒裝酮( Array<Int>
被映射到Java的Integer[]
)。 列表通常沒有針對原語優化的實現,盡管一些庫(JDK 之外)提供了原語優化的列表。
List<T>
和MutableList<T>
是映射類型,在 Java 互操作性中具有特殊行為(Java 的List<T>
在 Kotlin 中被視為List<T>
或MutableList<T>
)。 數組也被映射,但它們具有 Java 互操作性的其他規則。
某些數組類型用於注釋(原始數組、 Array<String>
和具有enum class
條目的數組),並且annotations有一個特殊的數組文字語法。 不能在注釋中使用列表和其他集合。
至於用法,好的做法是除了代碼的性能關鍵部分外,更喜歡在任何地方使用列表而不是數組,推理與Java相同。
與使用方面的主要區別在於Arrays具有固定大小,而(Mutable)List
可以動態調整其大小。 此外Array
是可變的,而List
不是。
此外kotlin.collections.List
是一個由java.util.ArrayList
實現的接口。 它也由kotlin.collections.MutableList
擴展,以在需要允許項目修改的集合時使用。
在 jvm 級別, Array
由arrays表示。 另一方面, List
由java.util.List
表示,因為 Java 中沒有可用的不可變集合等價物。
除了上述之外,身份比較也不同:
val l1 = listOf("a")
val l2 = listOf("a")
var x = (l1 == l2) // => true
val a1 = arrayOf("a")
val a2 = arrayOf("a")
var y = (a1 == a2) // => false
**一般來說,List和Array類型之間的不同之處是:**
List<...>:
僅供閱讀。
Array<...>:
你可以修改它,或添加一些東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.