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

时间:2018-04-17 14:49:25

标签: 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" -> "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中相同(对于变量a1和{{1在案例2中有什么不同?

1 个答案:

答案 0 :(得分:3)

如果您查看reference documentation,可以看到HashTrieMap是不可变地图的默认实现。

但是,Scala对包含少于五个元素的不可变集和映射进行了进一步优化。具有一到四个元素的集合和映射存储为单个对象,这些对象仅包含元素(或地图中的键/值对)作为字段 - 这就是您看到类Map4的原因。