我知道当映射的大小大于8 (8个键值对)时,Clojure会从PersistentArrayMap切换到PersistentHashMap。这可以通过以下方式进行验证:
(type {0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8})
=> clojure.lang.PersistentHashMap但是如果我使用zipmap创建上面的地图
(type (zipmap (range 9) (range 9)))
=> clojure.lang.PersistentArrayMap我确保构造是正确的:
(= (zipmap (range 9) (range 9))
{0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8})
=> true如果我使用(range 10),它就会开始使用PersistentHashMap。因此,对于zipmap,在开始使用PersistentHashMap之前,其大小必须为9或更大。
我觉得这很奇怪。为什么根据是手动创建地图还是使用zipmap创建地图,数据结构会有所不同
我使用的是Clojure 1.8。
发布于 2020-07-08 17:13:16
这是因为zipmap使用assoc以增量方式创建地图。由于一个错误,assoc从ArrayMap切换到大小大于9的HashMap,而不是9。看看这个:
(type {0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7})
=> clojure.lang.PersistentArrayMap # size = 8
(type (assoc {0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7}
8 8))
=> clojure.lang.PersistentArrayMap # size = 9
(type (assoc {0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7}
8 8 9 9))
=> clojure.lang.PersistentHashMap # size = 10该错误已在此处修复:https://github.com/clojure/clojure/commit/ce9fbf61f113fdef1cbf8c1c0b4ea1a48831beef
https://stackoverflow.com/questions/62791395
复制相似问题