直接调用包装类的compareTo方法安全且推荐,但需确保对象非null;若可能为null,应先校验或使用Objects.compare;Double/Float的compareTo遵循IEEE 754规则,能正确处理NaN和±0.0。

直接调用包装类的 compareTo 方法是安全且推荐的方式,前提是确保两个对象都不为 null;若存在 null 值,需提前处理,否则会抛出 NullPointerException。
使用 compareTo 前必须非空校验
Integer、Long、Double 等数值包装类的 compareTo 方法本身不接受 null 参数。一旦传入 null,运行时立即抛异常。
- 错误写法:
Integer a = null; a.compareTo(5); // 抛 NPE - 安全写法:先判空,再比较,例如:
if (a != null && b != null) return a.compareTo(b); - 也可用
Objects.compare(a, b, Integer::compareTo),它对null有约定(null视为最小值)
注意浮点包装类的特殊性
Double 和 Float 的 compareTo 遵循 IEEE 754 规则,能正确处理 NaN、+0.0、-0.0 等边界情况,比直接用 == 或 Double.compare() 手动实现更可靠。
-
Double.NaN在compareTo中被定义为大于所有其他值(包括正无穷) -
-0.0和+0.0被视为相等(compareTo返回 0),符合语义直觉 - 推荐统一使用
doubleValue()转基本类型再比较仅在确定无NaN时才可行
避免自动拆箱引发的空指针
不要依赖 ==、、<code>> 等运算符做比较,它们会触发自动拆箱——而 null 拆箱直接抛异常。
立即学习“Java免费学习笔记(深入)”;
- 危险操作:
Integer a = null; if (a > 0) {...} // NPE - 安全替代:
if (a != null && a.intValue() > 0),或更简洁地用compareTo - 集合排序(如
TreeSet<integer></integer>)内部就依赖compareTo,所以存入前务必保证元素非空或自定义比较器
统一比较逻辑可封装为工具方法
当业务中频繁需要安全比较,建议提取通用逻辑,明确 null 的语义(如视为空最小、空最大或禁止空)。
- 视
null为最小:return a == null ? -1 : (b == null ? 1 : a.compareTo(b)); - 视
null为最大:return a == null ? 1 : (b == null ? -1 : a.compareTo(b)); - 拒绝
null:Objects.requireNonNull(a); Objects.requireNonNull(b); return a.compareTo(b);


















