【问题标题】:What does the Scala interpreter (REPL) print exactly (demonstration with Map and HashMap)?Scala 解释器 (REPL) 究竟打印了什么(使用 Map 和 HashMap 进行演示)?
【发布时间】:2018-09-27 14:33:03
【问题描述】:

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

案例一

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 中却不同?

【问题讨论】:

  • 出于性能原因,Map.apply(被隐式调用)返回 Map 特征的不同实现,具体取决于存储的键值对数量。

标签: scala dictionary collections hashmap read-eval-print-loop


【解决方案1】:

如果您查看reference documentation,您会发现HashTrieMap 是不可变映射的默认实现。

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

【讨论】:

  • 地图通常不保证迭代顺序。如果您需要一个不可变的映射,那么 ListMap 就是您想要的。
  • 好的,谢谢。我了解性能原因,但为什么在案例 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的类型,Map4a1持有的值的类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2012-07-23
  • 2016-09-10
  • 2023-03-15
相关资源
最近更新 更多