scala mutable.map中的defaultentry示例太多

eeq64g8w  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(444)

斯卡拉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的内存示例:

我没想到会看到这么多 DefaultEntry . 原因是什么?

l2osamch

l2osamch1#

您的代码是正确的,示例也是正确的。给你1000欧元 n 对每一个 n 你叫:

map(n.toString) = s"number $n"
``` `map(key) = value` 只是给你打电话用的糖 `update(key, value)` 功能。
让我们看看 `update` 实施 `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` 在你的 `map` 1000次 `key` 总是独一无二的这就是为什么你有1000个 `DefaultEntry` 物体。

相关问题