如何在Java中实现固定大小List:新增元素时移除末尾并插入首位
实现固定大小、头部添加自动移除尾部的List
你可以通过自定义封装类或者直接在业务逻辑中处理的方式实现需求,以下是具体方案:
方案一:自定义封装类(推荐)
封装一个专门的类来处理固定容量和添加逻辑,避免重复代码,保证逻辑的一致性:
import java.util.ArrayList; import java.util.List; public class FixedSizeHeadInsertList<E> { // 固定容量为100 private static final int MAX_CAPACITY = 100; private final List<E> innerList; public FixedSizeHeadInsertList() { // 初始化ArrayList时指定初始容量,提升性能 innerList = new ArrayList<>(MAX_CAPACITY); } /** * 向列表头部添加元素,满容量时自动移除最后一个元素 */ public void addFirst(E element) { if (innerList.size() == MAX_CAPACITY) { // 移除最后一个元素(对应你说的"第100个元素") innerList.remove(MAX_CAPACITY - 1); } // 将新元素插入头部,原有元素自动后移一位 innerList.add(0, element); } // 提供必要的访问方法,避免外部直接修改内部列表 public List<E> getElements() { // 返回副本,防止外部修改破坏固定容量约束 return new ArrayList<>(innerList); } public int size() { return innerList.size(); } public E get(int index) { return innerList.get(index); } }
工作原理
- 内部使用
ArrayList存储元素,初始化时指定初始容量为100,减少扩容开销; - 调用
addFirst时,先判断是否已满:- 已满则移除最后一个元素(索引99,即你描述的"第100个元素");
- 然后将新元素插入到索引0的位置,原有元素的索引自动后移,原索引98的元素会变为索引99(对应你说的"原第99个元素变为第100个");
getElements方法返回内部列表的副本,避免外部直接修改内部结构导致容量失控。
方案二:直接在业务逻辑中处理
如果只是临时使用,也可以直接在业务代码中添加逻辑:
import java.util.ArrayList; import java.util.List; public class Demo { public static void main(String[] args) { List<String> fixedList = new ArrayList<>(100); // 模拟添加元素 addToFixedList(fixedList, "新元素1"); addToFixedList(fixedList, "新元素2"); // ... 后续添加 } private static void addToFixedList(List<String> list, String element) { if (list.size() == 100) { // 满容量时移除最后一个元素 list.remove(99); } // 插入到头部 list.add(0, element); } }
线程安全注意事项
如果在多线程环境下使用,需要为操作添加同步机制,比如给addFirst方法加上synchronized关键字,或者改用线程安全的列表实现(如CopyOnWriteArrayList,但频繁修改时性能较低)。
内容的提问来源于stack exchange,提问作者Andro
相关产品推荐
相关产品推荐

