![Java 中实现基于 int[] 的轻量级 List 包装器](https://img.php.cn/upload/article/001/246/273/177613225139470.jpg?x-oss-process=image/resize,p_40)
本文介绍如何通过继承 AbstractList 构建一个零开销的 List 包装器,内部以 int[] 存储数据,避免 Integer 装箱/拆箱与对象引用开销,适用于 LeetCode 等性能敏感场景。
本文介绍如何通过继承 abstractlist
在 Java 中,标准库 List
所幸,Java 标准库已为此类需求提供了坚实基础:AbstractList
以下是一个生产就绪(含边界检查)的轻量实现示例:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
import java.util.AbstractList;
import java.util.List;
public class IntArrayAsList extends AbstractList<integer> {
private final int[] data;
private final int offset; // 起始索引(支持视图切片)
private final int size; // 有效长度
public IntArrayAsList(int[] data) {
this(data, 0, data != null ? data.length : 0);
}
public IntArrayAsList(int[] data, int offset, int size) {
if (data == null) throw new NullPointerException("data");
if (offset data.length) {
throw new IndexOutOfBoundsException(
String.format("offset=%d, size=%d, array.length=%d", offset, size, data.length)
);
}
this.data = data;
this.offset = offset;
this.size = size;
}
@Override
public Integer get(int index) {
checkIndex(index);
return data[offset + index]; // 自动拆箱 → 装箱(仅在需要时发生)
}
@Override
public int size() {
return size;
}
// 可选:支持修改(需重写 set/add/remove)
@Override
public Integer set(int index, Integer element) {
checkIndex(index);
int oldValue = data[offset + index];
data[offset + index] = element; // 自动拆箱
return oldValue;
}
private void checkIndex(int index) {
if (index = size) {
throw new IndexOutOfBoundsException(
String.format("Index: %d, Size: %d", index, size)
);
}
}
}</integer>
使用方式简洁直观:
int[] raw = {1, 2, 3, 4, 5};
List<integer> list = new IntArrayAsList(raw); // 全量视图
List<integer> sub = new IntArrayAsList(raw, 1, 3); // 子视图 [2,3,4]
System.out.println(list.get(0)); // 1(无额外 Integer 对象)
System.out.println(sub.size()); // 3</integer></integer>
关键优势与注意事项:
✅ 零冗余对象:get() 返回时才按需装箱,遍历中若仅用 int 值(如 list.get(i).intValue() 或用于计算),JIT 通常能消除临时 Integer;
✅ 内存局部性好:int[] 连续存储,CPU 缓存友好;
✅ 切片零拷贝:通过 offset 和 size 支持子列表视图,无数组复制;
⚠️ 不可序列化/非线程安全:如需持久化或并发访问,需自行扩展;
⚠️ 谨慎替代 ArrayList
总结:Java 标准库未提供开箱即用的 List
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










