You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

new BigInteger()与BigInteger.valueOf()的区别及性能差异咨询

BigInteger 构造方法与 valueOf 方法差异、性能对比及使用建议

核心差异

  • 实例复用逻辑不同
    BigInteger.valueOf(long val) 内部实现了常用值缓存机制,JDK 默认会缓存 -16~16 区间的 BigInteger 实例,当入参落在这个区间时会直接返回已经创建好的缓存对象,不会生成新实例;而 new BigInteger() 无论传入什么值,每次调用都会在堆中创建全新的对象,没有复用逻辑。
  • 支持的入参类型不同
    BigInteger.valueOf() 仅支持传入 long 类型的数值作为入参;而 new BigInteger() 支持多种入参形式,包括十进制字符串、指定进制的字符串、字节数组、符号+数值数组等场景,适用范围更广。
  • 等值比较表现不同
    对于缓存区间内的相同数值,多次调用 BigInteger.valueOf() 返回的是同一个对象,用 == 比较会返回 true;而多次调用 new BigInteger() 构造的相同数值的对象是不同实例,用 == 比较会返回 false,只能用 equals() 方法判断值是否相等。

性能对比

你提到的 new BigInteger() 运行速度更快的说法是错误的,实际性能表现分两种情况:

  1. 当传入的数值落在缓存区间(默认 -16~16)时,BigInteger.valueOf() 不需要创建新对象,无论是执行速度还是内存开销都远优于 new BigInteger()
  2. 当传入的数值超出缓存区间时,BigInteger.valueOf() 底层也会调用构造方法创建新对象,二者的性能表现基本一致
    综上,不存在 new BigInteger() 比 BigInteger.valueOf() 更快的场景。

使用建议

  • 如果是从 long 类型数值转 BigInteger,优先选择 BigInteger.valueOf(),可以充分复用缓存,降低不必要的内存消耗,尤其在高频调用小数值转换的场景下性能提升明显
  • 如果需要从字符串、字节数组、自定义进制数等非 long 类型的数据源构造 BigInteger,再选择对应参数的 new BigInteger() 构造方法
  • 避免出现 new BigInteger(String.valueOf(100L)) 这类冗余写法,直接使用 BigInteger.valueOf(100L) 即可
  • 不要用 == 判断两个 BigInteger 的值是否相等,无论通过哪种方式构造,统一使用 equals() 方法做值比较更稳妥

内容的提问来源于stack exchange,提问作者打不了弟批

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:45:08