最稳妥做法是直接用 BigInteger 解析字符串,避免 long 截断风险;接口超大整数须按字符串接收,Jackson/Gson 需配置自动映射,手动解析需 trim 和校验格式,后续运算全程使用 BigInteger 方法,谨慎处理性能与溢出。

直接用 BigInteger 解析字符串,别碰 long——这是最稳妥、零风险的做法。
接口传入的大整数一律当字符串处理
外部接口(如 JSON、HTTP 查询参数、XML)返回的超大整数,即使看起来像数字,也必须按字符串接收。Java 的 JSON 库(如 Jackson、Gson)默认会把超长数字转成 long 或 double,导致静默截断或精度丢失。
- Jackson:配置
DeserializationFeature.USE_BIG_INTEGER_FOR_INTS,让所有整型字段自动映射为BigInteger - Gson:注册
TypeAdapter<BigInteger>,拦截所有数字字段并用new BigInteger(jsonElement.getAsString())构造 - 手动解析(如 URL 参数):拿到的是
String,直接传给new BigInteger(str.trim()),不经过Long.parseLong()或Integer.parseInt()
校验与容错不能省
字符串形式也不代表安全——空格、前导零、非法字符都会让 BigInteger 构造失败。
- 先
str = str.trim(),再检查是否为空或仅含符号(如"-") - 拒绝带逗号、
"0x"、下划线、科学计数法格式的输入(除非业务明确支持) - 捕获
NumberFormatException,返回清晰错误提示(如“非法大整数格式”),而非让服务崩溃
后续运算全程用 BigInteger 方法
一旦转成 BigInteger,就坚持到底:加减乘除、比较、取模全部调用对应方法,别混用基本类型。
立即学习“Java免费学习笔记(深入)”;
- 加法写
a.add(b),不是a + b(后者是字符串拼接) - 比较大小用
a.compareTo(b) == 0或a.compareTo(b) > 0,不用equals()(它比值,但语义易混淆) - 需要转回 long?只在确认不溢出时用
a.longValueExact();不确定就保留BigInteger,或转成String输出
性能敏感场景注意不可变开销
高频解析+运算时,BigInteger 每次操作都新建对象,可能触发 GC 压力。
- 单次解析+单次计算(如订单 ID 校验、金额比对):无压力,放心用
- 循环内反复累加(如统计千万条交易):避免链式调用
sum = sum.add(val),改用局部变量暂存,减少中间对象 - 纯校验场景(如判断是否大于某阈值):可用
a.compareTo(THRESHOLD) > 0,比转成 long 更安全


















