#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)
.