我知道当映射的大小大于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。
这是因为zipmap
使用assoc
增量创建映射。由于一个错误,assoc
从ArrayMap
切换到HashMap
,大小>9,而不是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