问题描述
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")
我没想到会看到如此多的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
个对象的原因。