众所周知,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
。