Почему следует избегать создания экземпляра biginteger в Java

#java #biginteger

#java #biginteger

Вопрос:

Существует правило PMD, в котором говорится, что следует избегать создания экземпляра BigInteger или BigDecimal, если существует предопределенная константа.

 BigInteger.ZERO

// instead of

new BigInteger(0)
  

Будет ли какое-либо другое преимущество, кроме экономии нескольких байтов?

Комментарии:

1. Это около 48 байт. Но это зависит от того, насколько он вызывается, имеет ли это значение. Если производительность критична, то BigInteger может быть не лучшим решением.

Ответ №1:

это позволяет избежать выделения этих нескольких байтов и необходимости собирать их позже

в узком цикле это может иметь значение

Ответ №2:

Да, сохраняя несколько инструкций JVM.

Ответ №3:

Возможно, производительность, если вы создаете много экземпляров 0. Альтернативой аргументу long/ int является

BigInteger.valueOf(0)

который возвращает BigInteger .НОЛЬ, если аргумент равен 0

Ответ №4:

Использование кэшированных значений, вероятно, значительно улучшит производительность в пространстве и времени.

Ответ №5:

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

Комментарии:

1. Вы имеете в виду, что valueOf использует эти константы?

2. @deamon да, проверьте docjar.com/docs/api/java/math/BigInteger.html#valueOf(long) в самом низу

3. @deamon Да, valueOf использует пул наиболее часто используемых значений. Например, BigInteger.valueOf кэширует 33 значения от -16 до 16, поэтому, когда вы вызываете его для этих значений, вы всегда будете получать один и тот же объект BitInteger для одного значения. BigInteger.ZERO просто BigInteger.valueOf(0) .