核心是分清值与对象:int是值、integer是对象;基本类型不可用instanceof;比较数值应优先用equals()或基本类型;循环中避免自动装箱;方法返回应明确null语义,推荐用int或optional。

核心就一条:分清“值”和“对象”——int 是值,Integer 是对象,用错场景就会掉坑里。
别拿基本类型去 instanceof
byte、int、long、boolean 这些根本不是对象,编译直接报错。比如 if (x instanceof byte) 会提示 “incompatible types”。要判断类型,必须用包装类:if (obj instanceof Byte) 或 if (obj instanceof Integer)。生产代码里出现对基本类型用 instanceof,99% 是混淆了类型概念。
比较数值时别乱用 ==
Integer a = 127, b = 127; System.out.println(a == b); // true
Integer c = 128, d = 128; System.out.println(c == d); // false
这不是 bug,是缓存机制(-128 ~ 127 范围内复用对象)。但新手常误以为 == 就是“相等”,结果在 128 及以上出错。正确做法:
- 比数值一律用
.equals()(注意判空)或直接用基本类型变量 - 如果确定是非 null 的 Integer,可先拆箱再比:
a.intValue() == b.intValue() - 更推荐:能用
int就不用Integer,从源头避开问题
循环和高频计算别自动装箱
写 for (Integer i = 0; i 或 <code>list.add(i)(i 是 int),每轮都触发 Integer.valueOf(i)。超出缓存范围就 new 对象,百万次 = 百万个短命对象,GC 压力陡增。
正确写法:
- 计数、累加、索引全部用
int/long,如int sum = 0; - 集合操作若真需原始类型,换用
IntArrayList、LongArray等专用容器 - 避免
Arrays.asList(1, 2, 3)—— 返回的是已装箱的List<integer></integer>
方法返回和参数别为 null 而硬用包装类
写 public Integer getId(),本意可能是“没值就返回 null”,但调用方一不注意就 NPE;或者三元表达式 Integer status = flag ? 200 : null,200 每次都 new 对象。
更稳健的做法:
- 业务上不可能为空,直接返回
int,让调用方无需判空 - 确实要表达“可能无值”,用
Optional<integer></integer>,语义清晰且强制处理 - 接口设计阶段就明确契约:null 是合法状态?还是异常情况?避免靠包装类“兼职”空值标记
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











