是否有在Java中使用BigInteger
的替代方法?
当您在BigInteger
上执行操作时,它始终会导致创建新的BigInteger
。是否有其他实现,其中两个大整数之间的某些操作的结果存储在其中一个中?
例如,在Java中执行两个大整数的乘法时:a * b
创建一个新的BigInteger
来托管结果。我想将结果存储在a
。
我想要这样做是为了提高算法
的某些情况下的性能答案 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;
}
}