Java 中实现一个定长 List 的解决方案

在开发中,我们经常会遇到需要维护一个固定长度的列表的场景。例如,在处理任务调度、缓存机制或配置参数时,定长列表能够帮助我们有效地管理数据。在 Java 中,我们可以自定义一个定长的 List,以实现此功能。

实际问题

假设我们正在构建一个任务调度程序,需要维护一个仅保存最近执行的任务的列表。任务的数量是固定的,例如,最多保存 5 个任务。当列表满时,我们希望能够自动覆盖最旧的任务。这种情况下,定长的列表变得尤为重要。

自定义定长 List 实现

在 Java 中,我们可以通过扩展 ArrayList 来创建一个定长的列表。我们重写 add 方法,使其在添加新元素时检查当前长度。如果长度超过了设定的最大值,就移除最旧的元素。

以下是实现代码:

import java.util.ArrayList;

public class FixedLengthList<T> extends ArrayList<T> {
    private final int capacity;

    public FixedLengthList(int capacity) {
        super(capacity);
        this.capacity = capacity;
    }

    @Override
    public boolean add(T element) {
        if (size() >= capacity) {
            remove(0); // 移除最旧的元素
        }
        return super.add(element);
    }
}

使用示例

下面是如何使用 FixedLengthList 类的示例代码:

public class TaskScheduler {
    public static void main(String[] args) {
        FixedLengthList<String> recentTasks = new FixedLengthList<>(5);

        // 添加任务
        for (int i = 1; i <= 7; i++) {
            recentTasks.add("Task " + i);
            System.out.println("After adding Task " + i + ": " + recentTasks);
        }
    }
}

运行以上代码会产生以下输出,展示出当超出固定长度时,最旧的任务是如何被覆盖的:

After adding Task 1: [Task 1]
After adding Task 2: [Task 1, Task 2]
After adding Task 3: [Task 1, Task 2, Task 3]
After adding Task 4: [Task 1, Task 2, Task 3, Task 4]
After adding Task 5: [Task 1, Task 2, Task 3, Task 4, Task 5]
After adding Task 6: [Task 2, Task 3, Task 4, Task 5, Task 6]
After adding Task 7: [Task 3, Task 4, Task 5, Task 6, Task 7]

从输出可以看到,当添加第六个和第七个任务时,最旧的任务(Task 1 和 Task 2)被自动移除,确保 recentTasks 始终保留最新的 5 个任务。

旅行图与类图

接下来,我们用 mermaid 的语法展示旅行图和类图。

旅行图

journey
    title 任务调度程序
    section 添加任务
      添加 Task 1: 5: 流程开始
      添加 Task 2: 5: 流程继续
      添加 Task 3: 5: 添加任务
      添加 Task 4: 5: 添加任务
      添加 Task 5: 5: 添加任务
      添加 Task 6: 5: 移除 Task 1
      添加 Task 7: 5: 移除 Task 2

类图

classDiagram
    class FixedLengthList {
        -capacity: int
        +FixedLengthList(int capacity)
        +add(T element): boolean
    }
    class TaskScheduler {
        +main(String[] args): void
    }

结论

通过以上实现,我们成功构建了一个定长的 List,能够在超过设定长度时自动移除最旧的元素。这种方法不仅可以帮助我们高效管理固定数量的数据,还提升了代码的可扩展性。希望本文能够为你在 Java 开发中实现定长 List 提供灵感与帮助。