Какова цель java.math.MutableBigInteger? - PullRequest
10 голосов
/ 21 мая 2009

java.math.MutableBigInteger доступно только внутри пакета. Он наследуется от java.lang.Object, и существует только один подкласс (SignedMutableBigInteger), который доступен только внутри пакета.

Ответы [ 3 ]

4 голосов
/ 21 мая 2009

Проблема с BigInteger заключается в том, что он неизменен: другими словами, если у вас есть объект BigInteger, вы не можете изменить значение самого объекта, вы можете заменить его только новым объектом.

Теперь это обычно хорошо, так как предотвращает алиасы и т. Д. (Вы не хотите, чтобы ваши «2 + 3» где-то внезапно превращались в «2 + 5», потому что пользователь этого «3» где-то еще в вашей программе поменял его на "5"). Однако внутри BigInteger использует массив для хранения компонентов этого значения. Для большого числа этот массив может быть довольно большим; BigInteger, представляющий базиллион, может нуждаться в массиве, скажем, тысячи элементов.

Так что же происходит, когда я хочу добавить один к этому BigInteger? Итак, мы создаем новый BigInteger, который, в свою очередь, создаст новый массив, состоящий из тысячи элементов, скопирует все элементы внутреннего массива старого BigInteger во внутренний массив нового BigInteger, за исключением последнего, и вставит новая версия этого последнего элемента увеличивается на единицу. (Или может потребоваться обновить последние два.) Если вам тогда не нужно старое значение, оно освобождает тот старый BigInteger, который освобождает массив.

Это, очевидно, довольно неэффективно, если вы все равно избавляетесь от старых значений. Поэтому, если у вас есть подобные операции, вы можете вместо этого использовать MutableBigInteger, который можно увеличить, просто изменив последний элемент во внутреннем массиве существующего MutableBigInteger. Это намного быстрее! Тем не менее, это разрушает старую ценность, которая может быть проблематичной, как я указал выше. Если кто-то даст вам int 3, вы можете ожидать, что он останется прежним. Если кто-то дает вам MutableBigInteger, не ожидайте, что это будет тот же самый номер позже!

4 голосов
/ 21 мая 2009
/**
 * 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
 */

Источник .

Я предполагаю, что MutableBigInteger используется внутри для больших вычислений BigInteger, которые замедляются частыми перераспределениями. Я не уверен, почему это не экспортируется как часть java.math. Возможно, какое-то отвращение к изменчивым классам значений?

Чтобы уточнить "изменчивый":
Стандартный BigInteger имеет одно значение за все время жизни, учитывая две ссылки BigInteger: «a» и «b», «a + b» всегда будет давать новый BigInteger с тем же значением. Допустим, это значение равно 4.

С MutableBigInteger «a + b» может выдать 4 изначально, но в какой-то момент в будущем даст 8, 16, 32 или любое другое число из-за ДРУГОГО кода, изменяющего значения (иначе говоря, мутирование) объектов, на которые ссылаются на "а" и "б". Соответственно, большинство (возможно, все) типов значений (Character, Short, Long, Integer, BigInteger, BigDecimal, Float, Double, даже String) в Java являются неизменяемыми.

1 голос
/ 21 мая 2009

Ссылка на MutableBigInteger указана в библиотеке java.math. Если у вас установлен JDK, проверьте содержимое файла src.zip в вашем каталоге jdk.

Вы увидите, что 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...