编写代码时,它会给我一个 ArrayMap。
(class (hash-map))
但是在我的代码中,出现了HashMap:
(class (hash-map "" ""))
问题是:“如何创建一个空的hash-map”?
编写代码时,它会给我一个 ArrayMap。
(class (hash-map))
但是在我的代码中,出现了HashMap:
(class (hash-map "" ""))
user=> (clojure.lang.PersistentHashMap/EMPTY)
{}
在我看来,更好的做法是展示你的意图。
您不需要太担心这个问题。运行时会根据情况选择最佳实现方式。PersistentArrayMap
适用于少量键值对的情况(即在时间和空间效率上更高),但是一旦键值对数量超过8个,就会升级为PersistentHashMap
,请参见相关代码了解详细信息。
*clojure-version*
{:major 1, :minor 5, :incremental 1, :qualifier nil}
; map declared with {} with 8 kv pairs is ArrayMap
(type {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8})
=> clojure.lang.PersistentArrayMap
; map declared with {} with 9 kv pairs is HashMap
(type {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9})
=> clojure.lang.PersistentHashMap
; assoc'ing 1 kv pairs into an ArrayMap is an ArrayMap (oddly)
(type (-> {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8}
(assoc :i 9)))
clojure.lang.PersistentArrayMap
; assoc'ing 2 kv pairs into an ArrayMap is an HashMap
(type (-> {:a 1 :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8}
(assoc :i 9)
(assoc :j 10)))
clojure.lang.PersistentHashMap
您可以像这样创建空哈希映射:
(. clojure.lang.PersistentHashMap create {})
(clojure.lang.PersistentHashMap/create {})
(clojure.lang.PersistentHashMap/EMPTY)
hash-map
的源代码:user=> (source hash-map)
(defn hash-map
"keyval => key val
Returns a new hash map with supplied mappings. If any keys are
equal, they are handled as if by repeated uses of assoc."
{:added "1.0"
:static true}
([] {})
([& keyvals]
(. clojure.lang.PersistentHashMap (create keyvals))))
从代码中可以看出,如果你没有提供参数,hash-map
函数会返回{}
,这是PersistentArrayMap
的实例。
如果你真的需要空的PersistentHashMap
实例,可以使用以下代码创建:
(. clojure.lang.PersistentHashMap create {})
您可以检查已创建实例的类:
```user=> (class (. clojure.lang.PersistentHashMap create {}))
clojure.lang.PersistentHashMap
user=> (class (clojure.lang.PersistentHashMap/create {}))
clojure.lang.PersistentHashMap
user=> (class (clojure.lang.PersistentHashMap/EMPTY)) ;; om-nom-nom's : much simpler
clojure.lang.PersistentHashMap
但是,我不确定这样做是否好或必要。也许你的代码不应该依赖于特定的实现类。
{}
是否是 PersistentArrayMap
的实例? - Abimaran Kugathasan(. clojure.lang.PersistentHashMap create {})
的意思是...使用{}
创建PersistentHashMap。 - ntalbs