Kotlin列表和数组

时间:2018-11-14 13:23:15

标签: kotlin

刚开始与Kotlin合作,我喜欢它,但是... 我对这种语言的列表和Arrys毫无意义。 我对编程并不陌生,不需要解释什么是数组。我不明白的是。

  1. 列表和数组有什么区别?它们看起来几乎与您使用a [index]访问和使用它们的方式几乎相同。如果列表是不可变的,它们甚至是相同的,所以...有什么区别?假设列表不是链接列表,它们都在O(1)访问时间内工作。

  2. 如果我使用列表;可变和不可变之间有什么区别?什么时候可以编辑内容?我什么时候可以更改长度?

  3. 同一事物的名称似乎有很多重叠和混乱的名称。 List,ListOf,ArrayList,IntArray,intArray ....
    有人可以详尽列出所有清单,并在您使用每一个清单时给出某种经验法则。具体来说,我发现一个不变的空列表的概念非常令人困惑。到底是做什么用的?

  4. 如何初始化这些东西?

很抱歉,很长的问题

谢谢。

2 个答案:

答案 0 :(得分:1)

  1. 第一个区别是List是描述一些常用列表操作的接口,而Array是一个类。从内存的角度来看,Array是内存中连续的区域,其大小不会改变,这就是为什么Array创建后无法更改其大小,但是可以在其上更改其元素的原因。另一方面,List可以以不同的方式实现,这意味着内存结构可以不同,最常见的实现方式是ArrayList,其中array用于存储元素,一旦数组被填充,则使用更大的array进行更改将旧内容添加到新内容中,另一实现是LinkedList,其中节点指向列表中的下一个元素。从性能的角度来看,Array总是比List的任何实现都要快,但是它的局限性也要大得多。
  2. ListMutableList之间的区别在于,当您使用MutableList时,可以更改该列表的元素(在其中添加或删除元素),而在使用不可变的{ {1}}您不能在其中添加或删除元素。这两个列表都允许您更改这些元素的属性。

  3. 将这个答案分为三个答案:

    • List是扩展List接口的接口,提供基本的公用列表操作,Collection扩展了MutableList接口以及List接口添加方法要更改该列表的元素,MutableCollection是创建listOf并使用给定参数填充的函数,通过使用List,我们不需要指定listOf的实现会被使用,例如在JVM List上受List支持(与java.util.Arrays.ArrayList不同),而在JavaScript方面,它可能被java.util.ArrayList备份(请使用声明,因为我从未与Kotlin一起使用过JS)
    • ArrayArrayList typealias ,没有什么特别的地方,它是Java java.util.ArrayList接口的实现,List得到了支持通过在JVM上的此实现。
    • MutableList等效于Java的数组,也没什么特别的,Array和其他原始数组公司用来弥补kotlin中缺少原始类型的情况,IntArray是与Java中的Array<Int>相同,而Integer[]IntArray相同。相同的逻辑适用于所有其他变体。使用基元类型可以获得更好的性能,但是在现代计算机上,大多数情况下可以忽略差异,即使您确实有大量数据,也应尽可能使用基元类型。

您可以在kotlin repository

上看到自己的所有集合层次结构
  1. 使用int[]listOfarrayOf之类的内置Kotlin函数,这不是必须的,但遵循最佳实践总是很好的。

答案 1 :(得分:0)

  

来自C / C ++的众多不同名称非常令人困惑。

那么这也许可以给C ++类比:

  1. Array类似于std::array(尽管在编译时不需要知道长度),或类似C数组,除了它存储长度并且所有访问都经过边界检查

  2. ArrayList就像std::vector(同样,所有访问都经过边界检查)。

  3. MutableListArrayList的接口(例如SequenceContainer)。

  4. ListMutableList的只读部分。

泛型的工作方式与C ++模板大不相同,特别是没有专门的知识:在C ++中,分别为std::vector<int>std::vector<std::string>生成了单独的代码,而在Java和Kotlin中则没有。 (实际上,Kotlin具有带有类型化类型参数的形式,但不适用于此处。) Array<Int>List<Int>必须使用装箱的java.lang.Integer而不是原始类型。但是Java确实有原始数组,这就是Kotlin所说的IntArray