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() 运行速度更快的说法是错误的,实际性能表现分两种情况:
- 当传入的数值落在缓存区间(默认 -16~16)时,
BigInteger.valueOf()不需要创建新对象,无论是执行速度还是内存开销都远优于new BigInteger() - 当传入的数值超出缓存区间时,
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,提问作者打不了弟批
相关产品推荐
相关产品推荐

