Java中包装类与基本类型比较的核心原则是:值比较优先用equals(),或用==(需满足自动拆箱条件);包装类间==比较仅适用于缓存范围内的同一类型对象,否则易出错。

Java 中包装类和基本类型比较,核心原则就一条:**值比较用 equals 或 ==(需满足自动拆箱条件),但必须清楚每种写法背后的实际行为**。盲目混用容易出 bug,尤其在判等逻辑中。
包装类与基本类型用 == 比较
只要 == 两边有一边是基本类型,Java 就会自动将包装类**拆箱**为对应基本类型,再做数值比较——这是安全且推荐的写法之一。
int a = 100; Integer b = 100; System.out.println(a == b); // truelong l = 42L; Long ll = 42L; System.out.println(l == ll); // true(ll 自动拆箱)double d = 3.14; Double dd = 3.14; System.out.println(d == dd); // true
注意:浮点数比较仍受精度影响,== 判等不等于数学相等,业务中建议用 Double.compare(d1, d2) == 0 更稳妥。
包装类与包装类用 == 比较
这是最容易踩坑的地方。== 比较的是对象引用地址,不是数值。结果取决于对象是否来自缓存池:
立即学习“Java免费学习笔记(深入)”;
- 对于
Integer、Short、Byte、Character(0–127)、Boolean,使用字面量或valueOf()创建时,-128 到 127 范围内会复用缓存对象 →==可能为true - 超出该范围,或用
new Integer(200)创建,每次都是新对象 →==一定为false
示例:
Integer a = 127, b = 127; System.out.println(a == b); // trueInteger c = 128, d = 128; System.out.println(c == d); // false
统一用 equals() 比较值
这是最安全、最推荐的跨类型值比较方式。包装类的 equals() 方法会先判断类型是否匹配,再比较数值:
Integer i = 100; int j = 100; System.out.println(i.equals(j)); // true(j 自动装箱为 Integer)Integer i = 100; Long l = 100L; System.out.println(i.equals(l)); // false(类型不同,直接返回 false)Long l1 = 42L; Long l2 = 42L; System.out.println(l1.equals(l2)); // true
⚠️ 注意:equals() 不做跨包装类类型转换(比如 Integer.equals(Long) 总是 false),也不接受 null ——调用前建议判空。
需要大小关系时用 compareTo()
当不只是“相等”,还要判断“大于”“小于”时,用 compareTo() 最准确:
- 返回负数、0、正数分别表示小于、等于、大于
- 支持 null 安全(如
Objects.compare(a, b, Integer::compareTo)) - 避免了
==和equals()在类型/缓存上的歧义
示例:
Integer x = 5, y = 3;if (x.compareTo(y) > 0) { System.out.println("x 大于 y"); }


















