核心是全程避免基本类型与包装类互转:使用原始类型函数式接口、原始流、专用集合及原始数组,变量声明优先用基本类型,杜绝隐式装箱拆箱。

核心是让基本类型全程不碰堆对象——从数据源头、接口选择、流操作到集合结构,全部绕过泛型包装层。
用原始类型专用函数式接口
别写 Predicate<Integer> 或 Function<String, Long>,它们每次调用都要拆箱或装箱。改用:
-
IntPredicate:
test(int value),输入直接是栈上 int,不拆箱 -
ToIntFunction<T>:
applyAsInt(T t),返回 int,不 new Integer - LongConsumer、ToDoubleBiFunction 等,按数值类型对号入座
Stream 操作全程保持原始类型
别让数据先变成 Stream<Integer> 再折腾,从创建开始就走原始流路径:
- 创建用
IntStream.range(0, 1000),不用Stream.iterate(0, i -> i + 1).limit(1000) - 数组转流用
Arrays.stream(intArray)(返回 IntStream),别用Arrays.asList(intArray).stream()(先全装箱) - 聚合直接调
sum()、max()、average(),返回 int 或 OptionalDouble,不生成 Optional<Integer>
集合与存储结构避开包装类容器
List<Integer> 本身就是装箱源头,高频读写场景必须替换:
立即学习“Java免费学习笔记(深入)”;
- 用 fastutil 的 IntArrayList 或 Eclipse Collections 的 IntList,底层存的是
int[] - Android 开发可选 SparseArray<String>,键为原始 int,零装箱
- 纯计算优先用原始数组
int[],配合IntStream.of(arr)启动处理
运算和赋值时守住基本类型变量
只要不涉及 null 语义或泛型约束,中间变量一律用 int、long:
- 接收包装类值后立刻解包:
Integer a = getA(); int raw = a != null ? a : 0; - 避免三元表达式隐式装箱:
Integer x = flag ? 123456 : null;超出缓存范围(-128~127)会每次 new,应显式控制 - 算术运算别留在包装类上:
list.stream().reduce(0, Integer::sum)仍反复拆箱;换成IntStream.of().sum()



















