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

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

BigInteger.ZERO

// instead of

new BigInteger(0)

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


person deamon    schedule 06.10.2011    source источник
comment
Его около 48 байт. Но это зависит от того, насколько это называется, имеет ли это значение. Если производительность критична, BigInteger может быть не лучшим решением.   -  person Peter Lawrey    schedule 06.10.2011


Ответы (5)


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

в тесной петле, которая может иметь значение

person ratchet freak    schedule 06.10.2011

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

person michael667    schedule 06.10.2011

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

BigInteger.valueOf(0)

который возвращает BigInteger.ZERO, когда аргумент равен 0

person andypandy    schedule 06.10.2011

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

person mre    schedule 06.10.2011

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

person tcb    schedule 06.10.2011
comment
Вы имеете в виду, что valueOf использует эти константы? - person deamon; 06.10.2011
comment
@deamon да проверьте docjar.com/docs/ api/java/math/BigInteger.html#valueOf%28long%29 внизу - person ratchet freak; 06.10.2011
comment
@deamon Да, valueOf использует пул наиболее часто используемых значений. Например, BigInteger.valueOf кэширует 33 значения от -16 до 16, поэтому, когда вы вызываете его для этих значений, вы всегда будете получать один и тот же объект BitInteger для одного значения. BigInteger.ZERO это всего лишь BigInteger.valueOf(0). - person tcb; 06.10.2011