如果我用>8个键,但如果我使用zipmap创建带有>8把钥匙



我知道当映射的大小大于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增量创建映射。由于一个错误,assocArrayMap切换到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

相关内容

最新更新