BigInteger Java: работа с большими числами

Язык Java в основном используется для написания больших корпоративных веб-приложений. Однако он также применим и других предметных областях, где довольно часто возникает необходимость в работе с очень большими числами. Хотя в Java имеются примитивные типы, бывают ситуации, где и их недостаточно.

Известно, что у всех примитивов есть одна неприятная особенность – переполнение типа, при котором выход за пределы допустимых значений приводит к некорректным вычислениям. Для этого существует специальный класс BigInteger. Java не была бы Java, если бы в ней не было отдельного класса с функциональностью и для этого случая. Рассмотрим его подробнее.

Класс BigInteger Java: описание

Как вы уже поняли, класс BigInteger служит оболочкой для больших целочисленных значений. Чтобы инкапсулировать число в объект данного типа, можно использовать одну из перегрузок его конструкторов, либо статический метод valueOf. Конструктор в качестве аргумента может принимать строку либо массив байтов. Для преобразования простых типов, представляющих целые числа, в BigInteger Java используют статический метод valueOf.

Поскольку в Java возможность перегрузки операторов отсутствует, для выполнения математических операций над инкапсулированными в данном классе значениями, предусмотрены соответствующие метода. О них далее и пойдет речь.

Java BigInteger: методы и примеры их использования

Данный класс имеет в своем арсенале множество методов, которые позволяют манипулировать числовыми значениями и производить над ними разнообразные математические операции. Ниже приведен список этих методов.

Разберем методы, выполняющие арифметические операции:

- add(value) – выполняет сложение значений текущего объекта, с переданным в качестве аргумента;

- subtract(subtractor) – выполняет вычитание subtractor от текущего значения;

- multiply(value) – выполняет умножение;

- divide(divider) – выполняет деление текущего значения на divider;

- pow(int arg) – возводит значение вызвавшего объекта в степень, величиной в arg;

- abs() – возвращает абсолютное значение вызвавшего объекта;

- negate() – возвращает объект BigInteger, значение которого имеет противоположный знак.

Давайте разберем простой пример выполнения арифметической операции над двумя инкапсулированными в объект значениями:

- BigInteger val1, val2, adding, dividing, oppositeSign;

- val1 = new BigInteger(“5”);

- val2 = BigInteger.valueOf(10);

- adding = val1.add(val2);

- dividing = val2.divide(val1);

- oppositeSign = val1.negate();

Обратите внимание на способ создание объектов. Переменная val1 инициализировалась при помощи конструктора, принявшего строку, и хранит значение 5. val2 имеет значение 10 в результате работы статического метода valueOf. Значение переменной adding это результат сложение первых двух переменных и равно 15. Переменная dividing соответственно хранит результат вычитания. oppositeSign равен значению val1 с противоположным знаком, т. е. -5.

Заключение

Как видите, класс BigInteger Java предоставляет различные инструменты для операций над очень большими числами. При этом переполнение типов исключено, так как безопасность в Java имеет один из самых высоких приоритетов, естественно без ущерба функциональности.

Комментарии
То есть, при использовании этого класса возможно создать число, стремящееся к бесконечности? Что происходит при переполнении оперативной памяти?
После значения 2^2147483647 (не включая) перестает работать, в таком числе примерно 646456992 символа