JAVA如何实现仅保存最新10个值的列表,适配循环输出场景
固定容量保存最新10个元素的Java实现方案
核心逻辑
每次新增元素后,若集合长度超过设定的最大值(此处为10),自动删除最早加入的元素即可,无需引入第三方依赖,JDK 自带集合类即可实现。
实现方式1:基于ArrayDeque实现(性能最优,推荐)
ArrayDeque 是 JDK 原生双端队列实现,尾部新增元素、头部删除元素的时间复杂度均为 O(1),完全适配需求:
import java.util.ArrayDeque; import java.util.Deque; public class FixedSizeContainer { public static void main(String[] args) { final int MAX_SIZE = 10; Deque<Integer> latestNumbers = new ArrayDeque<>(MAX_SIZE); // 模拟输出100个数字的循环 for (int i = 1; i <= 100; i++) { // 新元素添加到队列尾部 latestNumbers.offerLast(i); // 超过最大容量时删除队列头部的最早元素 if (latestNumbers.size() > MAX_SIZE) { latestNumbers.pollFirst(); } } // 输出结果为最后10个数字:[91, 92, 93, 94, 95, 96, 97, 98, 99, 100] System.out.println(latestNumbers); } }
需要转成普通List使用时,直接调用new ArrayList<>(latestNumbers)即可。
实现方式2:自定义List实现(符合List接口使用习惯)
如果希望用普通List的语法操作,可以继承ArrayList重写add方法,自动处理容量逻辑:
import java.util.ArrayList; public class LatestNList<E> extends ArrayList<E> { private final int maxSize; public LatestNList(int maxSize) { super(maxSize); this.maxSize = maxSize; } @Override public boolean add(E e) { boolean result = super.add(e); // 超过容量时删除第0位的最早元素 if (size() > maxSize) { remove(0); } return result; } }
使用示例:
public class Test { public static void main(String[] args) { LatestNList<Integer> latestNumbers = new LatestNList<>(10); for (int i = 1; i <= 100; i++) { latestNumbers.add(i); } // 输出结果为最后10个数字:[91, 92, 93, 94, 95, 96, 97, 98, 99, 100] System.out.println(latestNumbers); } }
注意事项
- 多线程场景下使用时,需要在新增元素的逻辑上加同步锁,或者替换为线程安全的集合类。
- 两种实现默认按「最早插入→最新插入」的顺序排列元素,需要倒序(最新元素放在最前)时,输出前调用
Collections.reverse()反转即可。
内容的提问来源于stack exchange,提问作者codingIT
相关产品推荐
相关产品推荐

