Java BigInteger替代方案

时间:2016-01-25 15:50:46

标签: java biginteger

是否有在Java中使用BigInteger的替代方法?

当您在BigInteger上执行操作时,它始终会导致创建新的BigInteger。是否有其他实现,其中两个大整数之间的某些操作的结果存储在其中一个中?

例如,在Java中执行两个大整数的乘法时:a * b创建一个新的BigInteger来托管结果。我想将结果存储在a

我想要这样做是为了提高算法

的某些情况下的性能

3 个答案:

答案 0 :(得分:14)

如果你能以某种方式做到这一点,我怀疑你的算法的性能会提高,但主要原则是BigInteger是不可变的。如果不生成新实例,就无法对其执行操作,并且有充分的理由想要这种行为 - 即,如果您在单个BigInteger上运行多个线程,则可以放心,这些线程不是&#39 ; t直接覆盖BigInteger *。

如果您不想要这种行为,那么您唯一的选择就是创建一个新课程,但请记住,您仍然会处理某些<{1}}的不可变性。 / em> layer。

*:Y&#39;知道,只要您不重新分配变量......

答案 1 :(得分:9)

那里有BigInteger的可变“版本”(例如:https://github.com/bwakell/Huldra)或者你可以推出自己的版本。使用可变对象可以降低GC上的压力。你真的应该对应用程序进行基准测试,看看这是否值得付出努力。

答案 2 :(得分:4)

除非您想要做的只是添加,否则您要求的内容不太可能具有更高的性能。其原因在于几乎任何数学运算(除了上述add之外)的结果中的比特数与原始数不同。您将几乎总是必须分配新数量的结果并将其复制回原始数据,因此您实际所做的只是让它变慢。

但是,如果您需要做的只是添加/ sub,那么这是可行的,实际上可能会更快一些,因为没有新阵列的分配用于添加。

几乎所有其他函数都会更好地委托给BigInteger类。

class MutableBigInteger {
    BigInteger n;

    public MutableBigInteger add (MutableBigInteger n) {
        this.n = this.n.add(n.n);
        return this;
    }
}