Kotlin中数组和集合之间的区别

时间:2019-07-02 22:03:48

标签: arrays kotlin set

有人可以告诉Kotlin中的 Set Array 之间的区别吗?在哪个条件下哪个更好?

2 个答案:

答案 0 :(得分:1)

简短的回答:数组是一个索引数据结构,包含固定数量的项;集合是一种无序数据结构,其中包含没有重复项的项目。两者都输入。

长答案:

从基本的意义上讲,Kotlin中的数组与大多数其他语言一样:一种存储相同类型值的数据结构。数组具有固定的长度,有序并按索引(从0开始)随机访问。

数组直接映射到Java数组。除了对象之外,这是JVM提供的唯一数据结构。 (实际上,数组类型被视为Object的特殊子类型。)这些类型是:您可以具有原始类型的数组(例如,整数数组)或引用类型的数组(例如,Numbers数组)。该类型在运行时可用并已强制执行。数组被视为协变的(可能导致运行时错误)。

在Kotlin / JVM中,Array继承了几乎所有这些功能(协方差除外)。它仅用于引用类型的数组; Kotlin为基元数组(IntArray&c)提供了单独的类。

从基本意义上讲,Set就像其他几种语言:一种无序的数据结构,用于保存相同类型的项,但没有一个相等。

Set是Java Collections框架(还包括CollectionListMap)的一部分的接口。 Set值可以指向实现该接口的任何对象。它是通用的,只有一个类型参数指定可以在集合中存储哪些值;这是在编译时发生的(仅)。

在Kotlin中,Set是协变的,并且是只读的;有一个MutableSet子接口,它添加了mutator方法。 MutableSet的大小是可变的,并且会根据需要增长和缩小。

Set(和MutableSet)接口有许多不同的实现,它们具有不同的性能特征:插入,移除和测试状态可能为O(1)或O(n)或两者之间,内存使用和并发性也有所不同。

可以迭代

Set,但是一般不指定顺序。 (某些实现可以保证顺序是否一致,如果一致,是否/如何与值相关和/或如何相加。)

那么,您应该使用哪个?如果需要防止重复,那么Set是显而易见的选择。而如果您需要对值进行排序,那么Array会更适合-尽管由于它不是Collections框架的一部分,所以它并不总是与其他Collection类型兼容。 (Kotlin提供了许多扩展方法来尝试消除间隙,但是仍然有很多极端情况。)因此,通常,通常最好使用List来代替:这样可以更好地控制可变性,避免某些变化尴尬的情况(尤其是关于类型参数),不固定长度,提供了更多扩展方法,并且短了一个字符!

答案 1 :(得分:0)

Set不允许在数组允许的地方重复元素,这取决于要求。 如果要求仅具有唯一值,那么Set是您最好的选择,因为Set的任何实现都仅维护唯一值。