2016-03-28 222 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

相关问题