BigInteger.multiply()底层根据位长自动选择朴素乘法或Karatsuba算法,返回新不可变对象,支持任意精度及正负数运算。

Java 中 BigInteger.multiply() 方法底层采用的是经典的分治算法——Karatsuba 乘法(当数字较大时),而小整数则用朴素的 O(n²) 乘法实现。它自动选择最优策略,开发者无需关心具体实现细节,直接调用即可获得高精度、无溢出的大整数乘法结果。
multiply() 的基本用法
这是最直观的使用方式:创建两个 BigInteger 实例,调用 multiply() 得到新对象。
- 结果是全新对象,原操作数保持不变(
BigInteger是不可变类) - 支持正负数、零,符号规则与普通乘法一致(负×负=正,负×正=负)
- 字符串构造时可带符号,如
new BigInteger("-123")
底层策略切换逻辑
OpenJDK 中该方法会根据操作数的位长(bitLength)动态选择算法:
- 位长较小时(例如
- 中等规模时启用 Karatsuba 算法(时间复杂度约 O(n^log₂3) ≈ O(n^1.58))
- 超大数(如数千位以上)可能进一步切换到 Toom-Cook 或 FFT 变体(取决于 JDK 版本和平台)
注意事项与常见误区
虽然接口简单,但实际使用中容易忽略几个关键点:
立即学习“Java免费学习笔记(深入)”;
-
不能用 * 运算符:Java 不支持运算符重载,必须显式调用
.multiply() -
避免链式构造陷阱:如
new BigInteger("123").multiply(new BigInteger("456"))每次都新建对象,高频场景建议复用或预创建常量 - 性能敏感场景需预估规模:千万位级乘法仍可能耗时数百毫秒,必要时考虑缓存或分块计算
- 除零异常不在此处抛出:乘法不会出现除零,但后续若做除法需单独检查
一个简洁示例
计算 123456789 × 987654321:
BigInteger a = new BigInteger("123456789");
BigInteger b = new BigInteger("987654321");
BigInteger result = a.multiply(b); // 返回 "121932631112635269"
System.out.println(result);


















