评论者:jafingerhut
我认为在最多8个键的map中查找float值只是实现上的一个意外。
在更大的map和hash set中使用时会失败,因为在(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的get操作意外返回了成功的查找之外,其他一切都是按设计工作的。
我认为使用小地图查找时能够找到匹配项(float 1)的原因可能是小地图的实现是作为一个ArrayMap,其中查找键会依次与数组中的所有键进行比较,使用clojure.core/=(或其Java等价物)进行比较,并且
用户=> (= (float 1) (double 1)) 真的