如何实现内部存储int[]的Java List<Integer>?标准库支持吗?
标准库是否有现成实现?
Java标准库没有直接提供这种内部用int[]存储、仅按需装箱的List<Integer>实现。你尝试的Arrays.asList(new int[]{1,2,3,4})之所以得到包含单个数组的列表,是因为Arrays.asList接收的是泛型可变参数,而int是基本类型,无法直接适配泛型参数,因此整个int[]会被当作单个Object元素,最终得到的是List<int[]>而非List<Integer>。
Java是否有相关优化?
标准库的ArrayList<Integer>内部使用Object[]存储装箱后的Integer对象,始终存在自动装箱/拆箱的开销。Java 8及之后的流操作(如IntStream.boxed().collect(Collectors.toList()))可以将int[]转换为List<Integer>,但该过程会立即完成所有元素的装箱,本质上仍是存储Integer对象,并非你需要的延迟装箱、用int[]作为底层缓冲区的实现。
是否需要自行实现List?
如果追求极致性能(比如LeetCode场景下减少装箱开销、提升内存利用率),需要自行实现List<Integer>接口。核心思路是:
- 用
int[]作为内部存储缓冲区 - 仅在调用
get()等需要返回Integer的方法时,才将对应的int值装箱 - 添加/修改元素时,将传入的
Integer拆箱为int存入数组
以下是一个极简实现示例(适配LeetCode常用场景):
import java.util.List; import java.util.Arrays; class IntArrayList implements List<Integer> { private int[] data; private int size; public IntArrayList(int[] arr) { data = arr.clone(); size = arr.length; } @Override public Integer get(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); return data[index]; // 仅在此处执行装箱 } @Override public int size() { return size; } @Override public Integer set(int index, Integer element) { int oldVal = data[index]; data[index] = element; // 拆箱操作 return oldVal; } @Override public boolean add(Integer element) { if (size == data.length) { data = Arrays.copyOf(data, size * 2); } data[size++] = element; return true; } @Override public boolean isEmpty() { return size == 0; } // 未用到的方法可抛出UnsupportedOperationException或按需实现 @Override public boolean remove(Object o) { throw new UnsupportedOperationException(); } }
LeetCode场景下的替代方案
如果不想手写完整实现,且可以接受立即装箱的开销,一行代码的标准库方案可以用:
List<Integer> list = IntStream.of(1,2,3,4).boxed().collect(Collectors.toList());
但要注意,该方案会一次性完成所有元素的装箱,内存和性能表现和普通ArrayList<Integer>一致,无法达到你想要的极致优化效果。若要真正减少装箱开销,还是自行实现基于int[]的List更合适。
内容的提问来源于stack exchange,提问作者trasadasyu

