kotlin/javascript 或 kotlin/native 中的 MutableMap 是 LinkedHashMap 吗?

is MutableMap in kotlin/javascript or kotlin/native a LinkedHashMap?

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

简短回答:不一定,甚至在 JVM 上也不行。如果您想依赖 LinkedHashMap 的行为,请明确使用它。


长答案:

As we know, A mutableMap object in kotlin/jvm is actually a LinkedHashMap object

这是不正确的。 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() 顶级 函数 目前 return 是所有平台上的 LinkedHashMap 实现,但它不是它的一部分合同(它不在文档中,return 类型只是 MutableMap),所以你不应该依赖它,因为它是函数的实现细节。

LinkedHashMap 在 Kotlin stdlib 的 common 部分定义,因此很可能所有平台的实际实现都应遵守 LinkedHashMap 的约定。所以如果你真的想保留插入顺序,你应该在代码中明确使用 LinkedHashMap