评论由:jafingerhut
我认为在map中查找float是一个实现上的意外。
之所以在大map和哈希集中失败,是因为(double 1.0)和(float 1.0)的哈希值不同。
user=> (hash (float 1.0)) 1065353216 user=> (hash 1.0) 1072693248
所有类似于1.0的值默认为double类型。请注意,如果您强制将map的键设置为float类型,则即使map中包含的值超过8个,查找也会成功。
user=> (get {(float 1.0) "a" 2.0 "b" 3.0 "c" 4.0 "d" 5.0 "e" 6.0 "f" 7.0 "g" 8.0 "h" 1 "i"} (float 1)) "a"
我的猜测是,除了使用小map时的意外之外,其他所有内容都按设计工作。
我认为用小地图(ArrayMap)查找匹配查找项(float 1)可能没有找到匹配的原因,可能是因为小地图的实现是一个数组映射,其中查找键按顺序与数组中的所有键进行比较,使用 clojure.core/=( 或其Java等价实现),以及
用户=> (= (float 1) (double 1)) true