包装类比较大小应避免用==,因其比较地址而非值;-128~127间Integer因缓存可能相等,超出范围则不等;判断相等用Objects.equals(),比较大小用compareTo()或解包后比较;优先使用基本类型。

面试中问到包装类比较大小,核心就一条:别用 == 判断数值是否相等,它比的是地址,不是值。
为什么 == 会出错
Integer、Long 等包装类是对象,== 比较的是两个引用是否指向同一块内存。JVM 对 -128 ~ 127 范围内的 Integer 做了缓存(通过 Integer.valueOf() 复用对象),所以:
-
Integer a = 100; Integer b = 100;→a == b是 true(碰巧复用) -
Integer c = 200; Integer d = 200;→c == d是 false(各自新建)
这种“有时对、有时错”的行为在面试中就是典型陷阱——不是 bug,是设计使然,但绝不能依赖。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
判断数值是否相等:统一用 Objects.equals()
这是最安全、最推荐的写法,Java 7+ 内置,自动处理 null 和类型校验:
立即学习“Java免费学习笔记(深入)”;
-
Objects.equals(a, b):a 和 b 都为 null → true;一个为 null → false;都非 null → 调用a.equals(b) - 比手写
a != null && a.equals(b)更简洁,也比a.equals(b)(左侧可能为 null)更健壮 - 注意:它不支持跨类型比较,
Objects.equals(new Integer(5), new Long(5))返回 false
判断谁大谁小:用 compareTo() 或解包后比较
要比较大小关系(>、
-
a.compareTo(b):返回负数/0/正数,语义清晰,适合排序和条件判断 - 解包比较:
a.intValue() > b.intValue(),但前提是 a、b 非 null;否则加判空或用Objects.nonNull(a) && Objects.nonNull(b) - JDK 9+ 可用
Objects.compare(a, b, Integer::compareTo),null 被视为最小值,一步到位
能用基本类型就别用包装类
如果业务逻辑里不需要表示 “缺失” 或 “未赋值”(即没有 null 语义),直接声明 int、long 更安全高效:
int a = 100, b = 200; if (a —— 此时 <strong>==</strong> 和 <strong><</strong> 都是合法且可靠的- 避免无谓的装箱/拆箱,既省性能,又绕开所有包装类陷阱
- 从数据库或 API 接收可能为 null 的值时,再考虑包装类,并立刻做空值防护

















