是MutableMap在kotlin/javascript或kotlin/native一个LinkedHashMap?&



众所周知,kotlin/jvm中的mutableMap对象实际上是一个LinkedHashMap对象,但在kotlin/js或kotlin/native环境中迭代时,它是否仍然始终保持其顺序?

简短回答:不一定,即使在JVM上也是如此。如果你想依赖LinkedHashMap的行为,请显式地使用它。


长答:

我们知道,kotlin/jvm中的mutableMap对象实际上是一个LinkedHashMap对象

这是不正确的。MutableMap是一个接口,因此它可以通过任何目标(包括JVM)上的任何类型的实现来实现。一般来说,依赖MutableMap的插入顺序很可能是一个坏主意,因为在它上的迭代并不保证按照与插入顺序相同的顺序进行。这是一个依赖于实现的行为(而不是依赖于目标的)。

在JVM上,您也可以将TreeMap用作MutableMap,这将不保留插入顺序:

val m: MutableMap<String, Int> = TreeMap()
m["a"] = 1
m["c"] = 3
m["b"] = 2
println(m) // prints {a=1, b=2, c=3}

现在,mutableMapOf()顶级函数目前在所有平台上返回LinkedHashMap实现,但它不是它的合同的一部分(它不在文档中,返回类型只是MutableMap),所以你不应该依赖它,因为它是函数的实现细节。

LinkedHashMap是在Kotlin标准库的common部分定义的,所以很可能所有平台的实际实现都应该尊重LinkedHashMap的契约。因此,如果你真的想保持插入顺序,你应该在你的代码中显式地使用LinkedHashMap

最新更新