Scala mutable.Map中DefaultEntry的实例过多

问题描述

Scala 2.11 mutable.Map实例化了太多DefaultEntry

要复制的代码

val map: mutable.Map[Int,String] = mutable.Map()
(1 to 1000000).foreach(n => map(n.toString) = s"number $n")

这是visualvm的内存示例:

enter image description here

我没想到会看到如此多的DefaultEntry实例。是什么原因?

解决方法

您的代码正确,实例也正确。在这里,您有1_000_001 n,并为每个n致电:

map(n.toString) = s"number $n"

map(key) = value只是调用update(key,value)函数的语法糖。

让我们看看update的{​​{1}}实现,默认情况下为mutable.Map

HashMap

转到override def update(key: A,value: B): Unit = put(key,value)

put
在方法override def put(key: A,value: B): Option[B] = { val e = findOrAddEntry(key,value) if (e eq null) None else { val v = e.value; e.value = value; Some(v) } } protected def findOrAddEntry[B](key: A,value: B): Entry = { val h = index(elemHashCode(key)) val e = findEntry0(key,h) if (e ne null) e else { addEntry0(createNewEntry(key,value),h); null } } protected def createNewEntry[B1](key: A,value: B1): Entry = { new Entry(key,value.asInstanceOf[B]) } createNewEntry中创建

。您在new Entry上调用update 1_000_001次,而map始终是唯一的,这就是您拥有1_000_001 key个对象的原因。