在java中,BigInteger是不可变的,但我想理解为什么,因为很多时候它被用来做很多可以产生很多对象的计算。所以,不要让它变得不可变,感觉有点直观。我想到的情况就是字符串操作,然后是StringBuilder的选项。应该有BigInteger的非永久性对应物吗?我认为在很多情况下这可能是有益的。
编辑:我知道不变性的好处以及在许多情况下它是如何有益的。我只是想了解一下BigInteger的好处。我用BigInteger来计算大数的阶乘。所以,我更喜欢可变的BigInteger。类似地,BigInteger将用于计算,其结果远大于int。对于其他情况,有BigDecimal。
答案 0 :(得分:13)
Effective Java在“第15项:最小化可变性”中解释了不可变类的好处:
不可变类 比设计,实现和使用更容易 可变课程。它们不太容易发生 错误,更安全。
不可变对象是 simple ,因为该对象只能存在于一个状态 - 它所创建的状态。简单代码往往具有更少的错误。由于无法修改对象,因此无需外部同步即可线程安全。
Bloch使用BigInteger
作为示例解决了不可变类的性能问题:
不可变类的唯一真正缺点是它们需要一个 每个不同值的单独对象。创建这些对象可能成本很高, 特别是如果它们很大的话。 [...]
在内部,不可变类可以任意聪明。例如,BigInteger有一个包私有的可变“伴侣类”,它用于加速多步操作,例如模幂运算。 由于前面提到的所有原因,使用可变伴随类比使用BigInteger要困难得多,但幸运的是你不必:BigInteger的实现者为你做了很多努力。
在内部,BigInteger
已经为您做了一些优化。如果你真的想要一个可变BigInteger
,你可以使用BitSet
,但请注意,这可能会使你的代码更复杂 - 而且更容易出错。您应该使用最简单的解决方案(BigInteger
),除非您确信使用可变版本会给您带来明显的性能提升(另请参阅“项目55:明智地优化”)。