Scala解释器(REPL)到底打印什么(使用Map和HashMap进行演示)?

Scala解释器(REPL)到底打印什么(使用Map和HashMap进行演示)?,scala,dictionary,collections,hashmap,read-eval-print-loop,Scala,Dictionary,Collections,Hashmap,Read Eval Print Loop,我在Scala中的REPL中有以下两个映射: 案例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" -

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

案例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$Map4
scala.collection.immutable.HashMap$HashTrieMap
)不同?输出文本的确切含义是什么?我知道有四个以上元素的
Map
使用
HashMap
而不是
Map
,但是为什么情况1中的输出文本相同(对于变量
a1
a2
),而情况2中的输出文本不同?

如果您查看,您可以看到a是不可变映射的默认实现


然而,Scala对包含少于五个元素的不可变集合和映射进行了进一步优化。带有一到四个元素的集合和映射被存储为单个对象,其中只包含元素(或映射中的键/值对)作为字段-这就是您看到该类的原因。

出于性能原因,
map.apply
(隐式调用)返回
映射的不同实现,取决于存储了多少键值对。映射通常不保证迭代顺序。如果你需要一个不变的映射,那么这就是你想要的。好的,谢谢。我理解性能原因,但为什么案例1中的输出文本不不同?为什么案例1包含以下文本
scala.collection.immutable.Map[String,String]
而不是
…scala.collection.immutable.Map$Map4…
…scala.collection.immutable.HashMap$HashTrieMap…
scala.collection.immutable.Map[String,String]
是变量的类型
a1
Map4
a1