应使用字符串构造BigInteger,因Java无BigInteger(long)构造方法;运算须调用add、subtract等方法而非操作符;比较用compareTo,转换用longValueExact;注意不可变性带来的性能开销。

直接用 BigInteger,别试图用 long 强转或写数字字面量——Java 没有 BigInteger(long) 构造方法,硬写会编译失败。
构造方式:字符串是唯一安全入口
所有超出 Long.MAX_VALUE(9223372036854775807)的值,只能通过字符串初始化:
-
new BigInteger("123456789012345678901234567890")—— 正确,唯一推荐方式 -
BigInteger.valueOf(123L)—— 仅限long范围内,且对 -16 到 16 有缓存优化 -
new BigInteger("FF", 16)—— 支持 2~36 进制,适合解析哈希、协议数据 - 输入字符串必须 trim 并校验:空格、前导零、逗号、“0x”等都会触发
NumberFormatException
算术运算:只认方法,不认符号
Java 不支持操作符重载,+、-、*、/ 在 BigInteger 上要么报错,要么意外拼接字符串。
- 加减乘除:用
a.add(b)、a.subtract(b)、a.multiply(b)、a.divide(b) -
divide要求整除,否则抛ArithmeticException;需截断商时用a.divideToIntegralValue(b) - 取模优先用
a.mod(b)(要求b > 0,结果 ∈ [0, b)),而非a.remainder(b)(结果符号随被除数) - 幂运算只接受非负整数指数:
a.pow(1000)可行,a.pow(-1)编译失败
比较与转换:避开三大陷阱
== 比引用,equals() 不表达大小,longValue() 会静默截断——这三个都是高频错误。
- 比较大小必须用
a.compareTo(b):返回 -1/0/1,可直接用于条件判断 - 转
long必须用a.longValueExact(),溢出时明确抛异常,不丢数据 - 判断正负用
a.signum()(-1/0/1),比a.compareTo(BigInteger.ZERO)更轻量 - 检查奇偶用
a.testBit(0),比a.remainder(TWO).equals(ONE)快得多
性能注意:不可变性带来开销
BigInteger 不可变,每次运算都新建对象。循环中频繁调用 add 或链式调用会显著增加 GC 压力。
- 小范围计算坚持用
long,真正需要大数时才切到BigInteger - 避免深度链式:
a.add(b).multiply(c).subtract(d)生成 3 个中间对象;拆成带变量的步骤更可控 - 密码学场景务必用
a.modPow(exp, mod),而不是先pow再mod,防止中间值爆炸

















