java.math.MutableBigInteger的目的是什么?

时间:2009-05-21 00:57:18

标签: java

java.math.MutableBigInteger仅在包内提供。它继承自java.lang.Object,并且只有一个子类(SignedMutableBigInteger),只能从包内部获得。

3 个答案:

答案 0 :(得分:4)

/**
 * A class used to represent multiprecision integers that makes efficient
 * use of allocated space by allowing a number to occupy only part of
 * an array so that the arrays do not have to be reallocated as often.
 * When performing an operation with many iterations the array used to
 * hold a number is only reallocated when necessary and does not have to
 * be the same size as the number it represents. A mutable number allows
 * calculations to occur on the same number without having to create
 * a new number for every step of the calculation as occurs with
 *  BigIntegers.
 *
 * @see BigInteger
 * @version 1.12, 12/19/03
 * @author Michael McCloskey
 * @since 1.3
 */

Source

我猜MutableBigInteger在内部用于BigInteger繁重的计算,这些计算会因频繁的重新分配而变慢。我不确定为什么它不作为java.math的一部分导出。也许对可变价值类有些厌恶?

澄清“可变”:
标准BigInteger在其整个生命周期中都有一个值,给定两个BigInteger引用“a”& “b”,“a + b”将始终产生具有相同值的新BigInteger。假设价值是4。

使用MutableBigInteger,“a + b”最初可以产生4,但由于其他代码更改引用的对象的值(也就是变异),将来会在某个时间点产生8,16,32或任何其他数字通过“一个”& “B”。因此,Java中的大多数(可能是所有)值类型(Character,Short,Long,Integer,BigInteger,BigDecimal,Float,Double,甚至String)都是不可变的。

答案 1 :(得分:4)

BigInteger的问题在于它是不可变的:换句话说,一旦你有一个BigInteger对象,你就无法改变对象本身的值,你只能用一个新对象替换它。

现在这通常很好,因为它可以防止锯齿等等(你不希望你的“2 + 3”突然变成“2 + 5”,因为那个“3”的用户在其他地方在你的程序中将其更改为“5”)。但是,BigInteger内部使用数组来保存此值的组件。对于大量的数组,这个数组可能非常大;一个代表bazillion的BigInteger可能需要一个数千个元素,比如说。

那么当我想在这个BigInteger中添加一个时会发生什么?好吧,我们创建一个新的BigInteger,它将创建一个内部包含一千个元素的新数组,将旧BigInteger内部数组的所有元素复制到新BigInteger的内部数组中,除了最后一个,然后放入最后一个元素的新版本加1。 (或者它可能需要更新最后两个。)如果您不需要旧值,它会释放旧的BigInteger,从而释放数组。

如果你只是摆脱旧的价值观,这显然是非常低效的。因此,如果您有这样的操作,您可以使用MutableBigInteger,只需更改现有MutableBigInteger的内部数组中的最后一个元素即可增加它。这要快得多!但是,正如我在上面指出的那样,它确实会破坏旧值,这可能会有问题。如果有人给你int“3”,你可以期望保持不变。如果有人给你一个MutableBigInteger,那么以后不要指望它是相同的数字!

答案 2 :(得分:1)

java.math库中引用了MutableBigInteger。如果安装了JDK,请查看jdk目录中src.zip的内容。

你会看到BigInteger使用它:

public BigInteger divide(BigInteger val) {
    MutableBigInteger q = new MutableBigInteger(),
                      r = new MutableBigInteger(),
                      a = new MutableBigInteger(this.mag),
                      b = new MutableBigInteger(val.mag);

    a.divide(b, q, r);
    return new BigInteger(q, this.signum * val.signum);
}

MutableBigInteger是BigInteger使用的数学算法的封装。