Java泛型不支持基本类型,因类型擦除后需统一为引用类型,而基本类型非对象;高效方案是放弃泛型抽象,为每种基本类型提供专用实现(如IntArrayList),或试用Project Valhalla的@Specialized预览特性。

Java泛型本身不支持基本类型(如 int、double),因为泛型在编译期被擦除为引用类型(通常是 Object),而基本类型不是对象,无法直接参与类型擦除后的统一处理。这导致你不能写 List<int></int> 或 new T[10](当 T 是基本类型时)。但“内存紧凑”和“高效”恰恰是基本类型的核心优势——避免装箱、减少 GC、提升缓存局部性。所以绕过限制的关键不是强行泛化基本类型,而是**放弃泛型抽象,为每种基本类型提供专用实现**。
用原始类型专用类替代泛型容器
这是最直接、最高效的方式。JDK 自身就采用该策略:没有 ArrayList<int></int>,但有 IntStream、IntBuffer;第三方库如 Eclipse Collections、Trove、FastUtil 都提供 IntArrayList、LongObjectHashMap 等。
- 每个类只处理一种基本类型,内部用
int[]、long[]等原生数组存储,零装箱开销 - 方法签名明确(如
add(int)、get(int index)),编译器可内联、JIT 可深度优化 - 内存布局连续,CPU 缓存友好,吞吐量远高于
ArrayList<integer></integer>
用 @Specialized 注解(Project Valhalla 预览特性)
Java 正在通过 Project Valhalla 探索值类型(Value Types)和泛型特化(Specialization)。虽然尚未正式发布(截至 2026 年中仍属预览),但你可以体验 --enable-preview 下的 @Specialized:
- 定义一个泛型接口或类,用
@Specialized(int.class)标注,JVM 在运行时生成专用字节码版本 - 效果类似 C++ 模板实例化,
List<int></int>将真正存在,底层为int[] - 需启用预览功能:
javac --enable-preview --source 24 MyList.java,运行时加--enable-preview
用 Object 数组 + Unsafe 或 VarHandle 手动管理内存(高级场景)
若需极致控制(如自研序列化、JNI 交互、高性能缓存),可跳过 JVM 的类型系统,用 Unsafe 或 VarHandle 直接操作堆外或堆内原始内存:
立即学习“Java免费学习笔记(深入)”;
- 分配一块连续内存(如
long address = Unsafe.allocateMemory(size)) - 用
unsafe.putInt(address + offset, value)写入int,用unsafe.getInt(address + offset)读取 - 完全绕过对象头、引用、GC,但失去安全性、可移植性和调试支持,仅限极少数基础设施场景
避免踩坑:别用泛型包装基本类型假装高效
以下做法看似绕过限制,实则适得其反:
-
ArrayList<integer></integer>:每次 add/get 都触发自动装箱/拆箱,创建大量临时对象,GC 压力大 -
Object[]存int:编译不报错,但运行时是Integer实例,内存反而更松散(对象头 + 值) - 反射创建
int[].class数组:虽可行(Array.newInstance(int.class, n)),但返回的是int[],无法纳入泛型容器统一接口,仍需分支处理


















