java中biginteger通过动态内存分配实现任意精度整数运算,规避基本类型位宽限制;构造须用字符串或valueof(),运算需调用add()等方法,不可用操作符;比较用compareto(),转换用longvalueexact(),注意不可变性与性能优化。

Java 中用 BigInteger 解决超长整数溢出,核心是绕过基本类型的固定位宽限制,改用动态分配内存的任意精度整数实现。它不依赖 long 或 int 的 64 位/32 位边界,只要内存够,就能精确表示和运算任意大的整数。
构造必须走安全入口
不能写 new BigInteger(123456789012345678901234567890L)——Java 没有接受 long 参数的构造方法,编译直接失败。也不能用数字字面量硬写,因为字面量本身在编译期就会溢出。
- 超范围大数一律用字符串:
new BigInteger("123456789012345678901234567890") - long 范围内的值优先用静态工厂:
BigInteger.valueOf(123L)(更高效,还有小值缓存) - 十六进制或二进制数据可用带进制参数的构造:
new BigInteger("FF", 16)、new BigInteger(bytes) - 输入字符串要提前 trim 并校验,空格、前导零、逗号、“0x”都会抛
NumberFormatException
运算只能调用方法,不能用符号
Java 不支持操作符重载,+、-、*、/ 对 BigInteger 无效,强行使用要么编译报错,要么意外触发字符串拼接。
- 加减乘除:用
a.add(b)、a.subtract(b)、a.multiply(b)、a.divide(b) - 除法注意:
divide()要求整除,否则抛ArithmeticException;需截断商可用divideToIntegralValue() - 取模推荐
a.mod(b)(要求b > 0,结果恒为非负),比remainder()更符合数学模运算习惯 - 幂运算只支持非负整数指数:
a.pow(1000)合法,a.pow(-1)编译不过
比较和转换要避开常见陷阱
== 比的是引用,equals() 只判相等不反映大小,longValue() 会静默截断——这三个都是高频错误点。
- 比大小必须用
a.compareTo(b):返回 -1 / 0 / 1,可直接用于 if 或 switch - 转 long 必须用
a.longValueExact():溢出时明确抛ArithmeticException,不丢精度 - 判断正负用
a.signum()(-1/0/1),比a.compareTo(BigInteger.ZERO)更轻量 - 检查奇偶用
a.testBit(0),比a.remainder(TWO).equals(ONE)快得多
性能与不可变性必须心里有数
BigInteger 是不可变对象,每次运算都生成新实例。看似简洁的链式调用,背后可能产生大量临时对象,加重 GC 压力。
- 小范围计算坚持用
long,真正需要大数时才切到BigInteger - 避免深度链式:
a.add(b).multiply(c).subtract(d)生成 3 个中间对象;拆成带中间变量的步骤更可控 - 密码学场景务必用
a.modPow(exp, mod),而不是先pow再mod,防止中间值爆炸
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











