簡體   English   中英

Kotlin 中列表和數組類型的區別

[英]Difference between List and Array types in Kotlin

ListArray類型有什么區別?
似乎可以對它們進行相同的操作(循環、過濾器表達式等),在行為或用法上有什么不同嗎?

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>具有addremove功能,因此可以增加和減小其大小。

     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
  • 陣列被用於原語優化:有單獨IntArrayDoubleArrayCharArray等,其被映射到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 級別, Arrayarrays表示。 另一方面, Listjava.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM