【发布时间】:2020-09-19 20:09:10
【问题描述】:
它是实现为 HashSet、链接 HashSet 还是二叉搜索树?
我知道它是为封装而隐藏的,但我需要估计渐近运行时间。
【问题讨论】:
-
如果您需要特定的实现,请明确调用。
mutableSetOf返回的是一个可以改变的实现细节。
标签: kotlin data-structures collections constructor set
它是实现为 HashSet、链接 HashSet 还是二叉搜索树?
我知道它是为封装而隐藏的,但我需要估计渐近运行时间。
【问题讨论】:
mutableSetOf 返回的是一个可以改变的实现细节。
标签: kotlin data-structures collections constructor set
查看标准库的源代码可能会很有趣且具有启发性——但今天mutableSetOf()发生返回的内容并不重要,因为这可能会在未来的 Kotlin 版本中发生变化。
重要的是the documentation 没有提到类,只是MutableSet 接口。这就是 JetBrains 所做的一切,因此您可以放心地假设。 您不应该依赖特定的实施选择,如果这不是合同的一部分。
(他们唯一指定的另一件事是“返回的集合保留了元素的迭代顺序。”所以你知道它不能返回 HashSet,但事实并非如此。但这仍然留下了几种当前的可能性,并且未来可能会更多。Oracle 或 JetBrains 可能会提出一个新的实现,它具有更好的一般或最坏情况下的性能,或其他一些理想的特性。)
将结果向下转换为 LinkedHashSet 在今天可能可行,但在未来的 Kotlin 版本中可能会因 ClassCastException 而失败。 (或者更糟糕的是,它可能在大多数时间都起作用,然后在你不期待它的时候抛出ClassCastException。)
所以,如果您有特定的性能要求,那么您最好明确创建您想要的类型。
mutableSetOf() 适用于当您没有有特定要求,并且只想要一些简单但总体上可能表现良好的东西。
【讨论】:
在我的 kotlin stdlib 安装中查找实现:
public inline fun <T> mutableSetOf(): MutableSet<T> = LinkedHashSet()
【讨论】: