2016-03-28 179 views
47

ListArray類型有什麼區別?
看來可以對它們進行相同的操作(循環,過濾表達式等),行爲或用法上有任何區別嗎?Kotlin中的列表和數組類型之間的區別

val names1 = listOf("Joe","Ben","Thomas") 
val names2 = arrayOf("Joe","Ben","Thomas") 

for (name in names1) 
    println(name) 
for (name in names2) 
    println(name) 

回答

88

Arrays和列表(由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>不具有修改的方法(它或者是read-only view of MutableList<T>immutable list implementation)。

    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>invariant on TArray<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[]),而不是boxed個(Array<Int>被映射到Java的Integer[])。一般而言,列表沒有針對基元優化的實現,儘管一些庫(JDK之外)提供了原始優化列表。

  • List<T>MutableList<T>mapped types並在Java的互操作性(Java的List<T>從科特林視爲要麼List<T>MutableList<T>)的特殊行爲。數組也被映射,但它們具有Java互操作性的other rules

  • 某些陣列類型在annotations(原始陣列,Array<String>,並用enum class條目陣列)中使用,並有一個特殊的array literal syntax for annotations。列表和其他集合不能用於註釋。

  • 至於使用方法,最好的做法是更喜歡使用列表遍佈數組,除了代碼的性能關鍵部分之外,推理與that for Java相同。

10

從利用側的主要區別是,Arrays具有固定的大小而(Mutable)List可以動態地調整它們的大小。此外Array是可變的,而List不是。

此外kotlin.collections.List是由java.util.ArrayList等實現的接口。它還擴展了kotlin.collections.MutableList,以便在需要修改項目的集合時使用。

在jvm級別Arrayarrays表示。另一方面,Listjava.util.List表示,因爲在Java中不存在不變的集合等價物。

+0

我並不完全相信這裏。 'Array'中有什麼可變的?只有它是元素 - 在List中相同。 List的大小也是固定的。 – AndroidEx

+0

@AndroidEx下面將編譯'val intArray = arrayOf(1,2,3); intArray [0] = 2',而這不會'val intList = listOf(1,2,3); intList [0] = 2'。 'List'的確有一個固定的大小,但是'MutableList'擴展了它,所以'val a:List '會在隨後的調用中報告不同的大小。 – miensol

+0

同意,謝謝澄清 – AndroidEx

相關問題