我正在寻找有关何时在Clojure中使用Clojure BigInt与Java BigInteger的指导。两者都工作正常,我假设使用BigInt的主要原因是利用+
和=
等运算符,这些运算符必须通过Java实例方法.add
访问例如,.equals
。但是很少有运营商,例如isProbablePrime
,我只能从BigInteger访问。
从BigInt转换到BigInteger似乎很容易,反之亦然,但两者的存在使我的用例不明确。我的下意识反应只是在没有明确标准的情况下坚持使用BigInteger,因为一些建议的用法似乎不起作用。来自clojuredocs here:
user=> (def x (bigint 97))
user=> (.isProbablePrime x 1)
IllegalArgumentException No matching method found: isProbablePrime for class
clojure.lang.BigInt clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)
答案 0 :(得分:24)
C. Emerick等人的“Clojure Programming”。 al。,p.428,有一个侧栏主题,“当Java已经在BigInteger中提供一个时,为什么Clojure有自己的BigInt类?”
他们注意到两个理由更喜欢BigInt
到Java的BigInteger
。首先,后者的.hashCode
实现与Long
的实现不一致(每种类型中表示的相同数字给出不同的哈希值)。在比较例如等效值时,这通常不是您想要的。哈希映射。
另一个原因是BigInt
被优化为尽可能使用原始类型,因此在许多情况下性能应该更好。
我会使用Clojure的数字类型,除非你有充分的理由不这样做(你使用.isProbablePrime
暗示你可能有足够的理由)。