【问题标题】:Why to avoid biginteger instantiation in Java为什么要避免在 Java 中进行大整数实例化
【发布时间】:2011-10-06 12:44:35
【问题描述】:

有一个PMD rule 说如果有预定义的常量,应该避免实例化 BigInteger 或 BigDecimal。

BigInteger.ZERO

// instead of

new BigInteger(0)

除了节省几个字节还有其他好处吗?

【问题讨论】:

  • 大约 48 个字节。但这取决于它是否重要。如果性能至关重要,那么 BigInteger 可能不是最佳解决方案。

标签: java biginteger


【解决方案1】:

它避免了分配那几个字节以及稍后收集它们的需要

在一个可能很重要的紧密循环中

【讨论】:

    【解决方案2】:

    是的,节省了一些 JVM 指令。

    【讨论】:

      【解决方案3】:

      如果您要实例化很多 0,则可能是性能。 long/int 参数的替代方法是

      BigInteger.valueOf(0)

      当参数为 0 时返回 BigInteger.ZERO

      【讨论】:

        【解决方案4】:

        通过使用缓存值,可能会产生明显更好的空间和时间性能。

        【讨论】:

          【解决方案5】:

          与其使用new BigInteger 创建新对象,不如使用一个静态对象,该对象在加载 BigInteger 类时创建一次。使用所有包装器类型的valueOf 也是如此。

          【讨论】:

          • 你的意思是valueOf 使用那些常量吗?
          • @deamon 是的,valueOf 使用最常用值的池。例如,BigInteger.valueOf 缓存了从 -16 到 16 的 33 个值,因此当您为这些值调用它时,您将始终为一个值获得相同的 BitInteger 对象。 BigInteger.ZERO 就是 BigInteger.valueOf(0)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-25
          • 1970-01-01
          • 1970-01-01
          • 2011-07-30
          相关资源
          最近更新 更多