> (conj [0] 1 2 3)
[0 1 2 3]
> (conj {:a "ei"} {:b "bi"})
{:b "bi", :a "ei"}
>
看,当它作用于矢量时,它将1,2,3放在它的末尾。 而它放在:b“bi”前面:地图k-v对 为什么是这样? 感谢
答案 0 :(得分:2)
与许多散列映射实现一样,Clojure's hashed maps不对其条目进行排序,也不保留它们的插入顺序。这样可以获得更好的性能。
请注意,conj也没有通用排序语义(它具有某些具体类型的排序语义,例如向量)。
答案 1 :(得分:0)
您不必像地图那样从conj
获取不一致的行为:
(conj [1] 2) ; [1 2]
(conj (list 1) 2) ; (2 1)
哈希地图没有定义的顺序。但是,对于任何地图,
seq
将始终相同vals
和keys
将按照一致的顺序排列。 因此,对于地图m
,
(= (keys m) (map key m))
(= (vals m) (map val m))
(= m (zipmap (keys m) (vals m)))
目前,此序列似乎与插入顺序无关。我通过随机抽取随机整数来测试这个集合。