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
。
我们知道,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
。