java包装类比较应避免==,数值相等用equals(),大小比较用compareto()或integer.compare(),null值须先判空或用nullslast等安全方式,防止npe和缓存导致的逻辑错误。

Java 中包装类比较大小,不能直接用 == 判断数值是否相等,否则容易因缓存机制或空指针导致逻辑错误。核心原则是:**数值比较用 equals() 或 compareTo(),避免用 ==;判空优先,再比较。**
别用 == 比较包装类的值
== 比较的是引用(内存地址),不是数值。虽然 Integer 在 [-128, 127] 范围内会复用缓存对象,看似能“碰巧”对,但超出范围就不可靠:
Integer a = 127; Integer b = 127; System.out.println(a == b); // true(走缓存) Integer c = 128; Integer d = 128; System.out.println(c == d); // false(新建对象,地址不同)
一旦代码依赖这种“偶然正确”,上线后可能出错。所有数值相等性判断,一律改用 equals()。
安全比较数值大小(升序/降序)
要用 compareTo() 方法(返回负数、0、正数),它内部自动处理 null 和数值逻辑:
- 推荐写法:
Integer.compare(x, y)(静态方法,可防 null) - 或显式调用:
x.compareTo(y),但需确保 x 不为 null - 若变量可能为 null,先判空再比,或用
Objects.compare(x, y, Integer::compareTo)
例如排序时:
List<integer> list = Arrays.asList(3, null, 1, 5); list.sort(Comparator.nullsLast(Integer::compareTo)); // null 放最后 </integer>
警惕自动拆箱引发的 NullPointerException
写 if (x > y) 看似简洁,实则隐含拆箱(x.intValue() > y.intValue())。只要 x 或 y 是 null,立刻抛 NPE:
Integer a = null;
if (a > 0) { ... } // 运行时报 NullPointerException!
正确做法是:先检查 null,再比较;或统一转成基本类型前兜底:
if (a != null && a > 0)int val = (a != null) ? a : 0;- 用
Optional.ofNullable(a).orElse(0) > 0
总结关键动作
数值相等?→ 用 equals()
数值大小?→ 用 compareTo() 或 Integer.compare()
可能为 null?→ 先判空,或用 nullsFirst/nullsLast 等安全比较器
避免隐式拆箱 → 别在条件中直接用 >、 等操作符对比包装类
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











