com.google.common.math的checkedAdd与java.lang.Math的addExact有何区别
Guava checkedAdd 与 JDK addExact 方法差异对比
二者核心功能完全一致:对两个整数执行加法运算,出现数值溢出时直接抛出异常,且入参、返回值类型完全匹配,核心差异集中在以下几点:
- 兼容版本差异
- JDK的
java.lang.Math.addExact()是JDK 8及以上版本才提供的内置API,无法在JDK 7及更低版本的环境中使用 - Guava的
com.google.common.math.IntMath.checkedAdd()(long类型对应LongMath.checkedAdd)从Guava 11.0版本开始提供,最低支持JDK 6环境,对老旧业务项目的兼容性更好
- JDK的
- API完整性差异
- JDK仅提供int、long两种基础类型的
addExact、subtractExact等少量溢出校验方法,没有覆盖更多运算场景和数值类型 - Guava的checked系列方法是完整的运算工具链,除了基础的加减乘除幂运算的溢出校验,还配套提供了大整数、BigDecimal场景的对应校验方法,整套API的覆盖场景更广
- JDK仅提供int、long两种基础类型的
- 异常信息差异
- 二者溢出时均抛出
ArithmeticException,但Guava的异常会携带明确的运算信息,类似overflow adding 2147483647 and 1,排查问题时可以直接获取参与运算的数值 - JDK原生
addExact抛出的异常默认没有携带运算参数相关的提示,定位溢出问题的成本更高
- 二者溢出时均抛出
- 性能表现差异
- 常规业务场景下二者性能几乎没有感知差异,高版本JDK环境中,
addExact作为JVM内置的intrinsic方法会得到指令级优化,极限压测场景下性能会略高于Guava的实现
- 常规业务场景下二者性能几乎没有感知差异,高版本JDK环境中,
- 接口设计差异
- JDK的所有数值运算方法都集中在
java.lang.Math类下,通过重载区分不同参数类型 - Guava按照数值类型拆分了独立的工具类,int、long、大整数等不同类型的运算分别归属
IntMath、LongMath、BigIntegerMath等不同类,API分类更清晰,查找同类型运算方法的效率更高
- JDK的所有数值运算方法都集中在
内容的提问来源于stack exchange,提问作者korpe
相关产品推荐
相关产品推荐

