clojure中的hash-map和array-map有什么区别?

时间:2014-09-26 01:08:33

标签: clojure hashmap array-map

Clojure有一个数组映射和哈希映射,我无法弄清楚两者之间的区别。任何人都可以用一个例子来解释它们何时会被使用?

2 个答案:

答案 0 :(得分:12)

array-maps保持插入顺序但你不应该依赖于那种行为,除非你知道地图不会被修改的非常简单的情况。如果您确实需要此行为,请使用an ordered collection

array-maps应该用于非常小的地图(16 keys right now)作为查找和修改"性能优于相同大小的哈希映射:

(def arraymap (array-map :f 1 :g 2 :h 4 :y 5 :w 4))     
(def hashmap (hash-map :f 1 :g 2 :h 4 :y 5 :w 4))

(defn add-2-keys [m]
  (assoc m :new 2 :w 4))

(defn access-all-keys [m]
  (mapv m [:f :g :h :y :w :not-there]))

(use 'criterium.core)

; Modification 
(bench (add-2-keys array map))
Execution time mean : 125.640082 ns    
(bench (add-2-keys hashmap))
Execution time mean : 150.918197 ns

; Access
(bench (access-all-keys arraymap))
Execution time mean : 260.547035 ns
(bench (access-all-keys hashmap))
Execution time mean : 305.350156 ns

答案 1 :(得分:8)

数组映射和散列映射具有相同的接口,但是数组映射具有O(N)查找复杂性(即,它实现为简单的条目数组),而散列映射具有O(1)查找复杂性。 / p>

阵列贴图具有维护插入顺序的优点(大部分时间都不需要),因此当您执行迭代地图的任何操作时(例如map或{{ 1}}),您可以按照插入条目时的顺序处理条目。

请注意,如果你"修改" (在持久收集意义上)重复一个数组映射,在某些时候它将成为一个哈希映射。 e.g。

reduce

基本上,如果您不关心按键顺序,请始终使用哈希地图。此外,如果您使用数组映射,请记住查找性能权衡。