我在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
和{{1在案例2中有什么不同?
答案 0 :(得分:3)
如果您查看reference documentation,可以看到HashTrieMap是不可变地图的默认实现。
但是,Scala对包含少于五个元素的不可变集和映射进行了进一步优化。具有一到四个元素的集合和映射存储为单个对象,这些对象仅包含元素(或地图中的键/值对)作为字段 - 这就是您看到类Map4的原因。