首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我手动创建一个>8个键的映射,为什么Clojure (1.8)创建一个HashMap,但是如果我使用zipmap创建>8个键的映射,为什么创建一个ArrayMap?

如果我手动创建一个>8个键的映射,为什么Clojure (1.8)创建一个HashMap,但是如果我使用zipmap创建>8个键的映射,为什么创建一个ArrayMap?
EN

Stack Overflow用户
提问于 2020-07-08 17:13:16
回答 1查看 119关注 0票数 1

我知道当映射的大小大于8 (8个键值对)时,Clojure会从PersistentArrayMap切换到PersistentHashMap。这可以通过以下方式进行验证:

代码语言:javascript
复制
(type {0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8})
=> clojure.lang.PersistentHashMap

但是如果我使用zipmap创建上面的地图

代码语言:javascript
复制
(type (zipmap (range 9) (range 9)))
=> clojure.lang.PersistentArrayMap

我确保构造是正确的:

代码语言:javascript
复制
(= (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。

EN

回答 1

Stack Overflow用户

发布于 2020-07-08 17:13:16

这是因为zipmap使用assoc以增量方式创建地图。由于一个错误,assocArrayMap切换到大小大于9的HashMap,而不是9。看看这个:

代码语言:javascript
复制
(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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62791395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档