刚开始与Kotlin合作,我喜欢它,但是... 我对这种语言的列表和Arrys毫无意义。 我对编程并不陌生,不需要解释什么是数组。我不明白的是。
列表和数组有什么区别?它们看起来几乎与您使用a [index]访问和使用它们的方式几乎相同。如果列表是不可变的,它们甚至是相同的,所以...有什么区别?假设列表不是链接列表,它们都在O(1)访问时间内工作。
如果我使用列表;可变和不可变之间有什么区别?什么时候可以编辑内容?我什么时候可以更改长度?
同一事物的名称似乎有很多重叠和混乱的名称。 List,ListOf,ArrayList,IntArray,intArray ....
有人可以详尽列出所有清单,并在您使用每一个清单时给出某种经验法则。具体来说,我发现一个不变的空列表的概念非常令人困惑。到底是做什么用的?
如何初始化这些东西?
很抱歉,很长的问题
谢谢。
答案 0 :(得分:1)
List
是描述一些常用列表操作的接口,而Array
是一个类。从内存的角度来看,Array
是内存中连续的区域,其大小不会改变,这就是为什么Array
创建后无法更改其大小,但是可以在其上更改其元素的原因。另一方面,List
可以以不同的方式实现,这意味着内存结构可以不同,最常见的实现方式是ArrayList
,其中array用于存储元素,一旦数组被填充,则使用更大的array进行更改将旧内容添加到新内容中,另一实现是LinkedList
,其中节点指向列表中的下一个元素。从性能的角度来看,Array
总是比List
的任何实现都要快,但是它的局限性也要大得多。 List
与MutableList
之间的区别在于,当您使用MutableList
时,可以更改该列表的元素(在其中添加或删除元素),而在使用不可变的{ {1}}您不能在其中添加或删除元素。这两个列表都允许您更改这些元素的属性。
将这个答案分为三个答案:
List
是扩展List
接口的接口,提供基本的公用列表操作,Collection
扩展了MutableList
接口以及List
接口添加方法要更改该列表的元素,MutableCollection
是创建listOf
并使用给定参数填充的函数,通过使用List
,我们不需要指定listOf
的实现会被使用,例如在JVM List
上受List
支持(与java.util.Arrays.ArrayList
不同),而在JavaScript方面,它可能被java.util.ArrayList
备份(请使用声明,因为我从未与Kotlin一起使用过JS)Array
是ArrayList
的 typealias ,没有什么特别的地方,它是Java java.util.ArrayList
接口的实现,List
得到了支持通过在JVM上的此实现。 MutableList
等效于Java的数组,也没什么特别的,Array
和其他原始数组公司用来弥补kotlin中缺少原始类型的情况,IntArray
是与Java中的Array<Int>
相同,而Integer[]
与IntArray
相同。相同的逻辑适用于所有其他变体。使用基元类型可以获得更好的性能,但是在现代计算机上,大多数情况下可以忽略差异,即使您确实有大量数据,也应尽可能使用基元类型。int[]
,listOf
,arrayOf
之类的内置Kotlin函数,这不是必须的,但遵循最佳实践总是很好的。答案 1 :(得分:0)
来自C / C ++的众多不同名称非常令人困惑。
那么这也许可以给C ++类比:
Array
类似于std::array
(尽管在编译时不需要知道长度),或类似C数组,除了它存储长度并且所有访问都经过边界检查
ArrayList
就像std::vector
(同样,所有访问都经过边界检查)。
MutableList
是ArrayList
的接口(例如SequenceContainer
)。
List
是MutableList
的只读部分。
泛型的工作方式与C ++模板大不相同,特别是没有专门的知识:在C ++中,分别为std::vector<int>
和std::vector<std::string>
生成了单独的代码,而在Java和Kotlin中则没有。 (实际上,Kotlin具有带有类型化类型参数的形式,但不适用于此处。) Array<Int>
和List<Int>
必须使用装箱的java.lang.Integer
而不是原始类型。但是Java确实有原始数组,这就是Kotlin所说的IntArray
。