Scala解释器(REPL)到底打印什么(通过Map和HashMap演示)?

4
我可以帮您翻译成中文。以下是需要翻译的内容:

我在Scala的REPL中有以下两个Map:

情况1

scala> var a1=Map("a" -> "b", "c" -> "d", "e" -> "f", "g" -> "h") 
a1: scala.collection.immutable.Map[String,String] = Map(a -> b, c -> d, e -> f, g -> h)

scala> var a2=Map("a" -> "b","c" -> "d","e" -> "f","g" -> "h","i" -> "j")
a2: scala.collection.immutable.Map[String,String] = Map(e -> f, a -> b, i -> j, g -> h, c -> d)

以上两个示例在REPL中打印相同的文本:

...
scala.collection.immutable.Map[String,String] = ...

但是以下两个示例显示不同的输出文本:
案例2
scala> a1.getClass.getName
res10: String = scala.collection.immutable.Map$Map4

scala> a2.getClass.getName
res11: String = scala.collection.immutable.HashMap$HashTrieMap

为什么REPL中的文本输出(scala.collection.immutable.Map$Map4scala.collection.immutable.HashMap$HashTrieMap)不同?这些输出文本到底是什么意思?我知道当Map元素超过四个时,会使用HashMap而不是Map,但为什么在情况1(变量a1a2)中输出文本相同,在情况2中却不同?

1
出于性能考虑,Map.apply(隐式调用)会返回不同的 Map 特质实现,具体取决于存储了多少键值对。 - jub0bs
1个回答

3
如果您查看参考文档,您会发现HashTrieMap是不可变映射的默认实现。
然而,Scala对包含少于五个元素的不可变集合和映射进行了进一步优化。具有一到四个元素的集合和映射被存储为仅包含元素(或在映射的情况下为键/值对)的单个对象作为字段 - 这就是为什么您会看到Map4类的原因。

地图通常不保证迭代顺序。如果您需要一个不可变的地图并且需要保证迭代顺序,那么ListMap就是您想要的。 - ggovan
好的,谢谢。我理解性能原因,但为什么情况1的输出文本不同呢?为什么情况1包含以下文本“scala.collection.immutable.Map [String,String]”,而不是“...scala.collection.immutable.Map $ Map4 ...”或“...scala.collection.immutable.HashMap $ HashTrieMap ...”? - Andrew_256
scala.collection.immutable.Map[String,String] is the type of the variable a1, Map4 is the type of the value held by a1 - ggovan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接