Java ArrayList 如何在开头添加元素

2022-08-31 05:42:30

我需要将元素添加到队列中,但是当我调用函数以添加元素时,我希望它在数组的开头添加元素(因此它具有最低的索引),并且如果数组有10个元素,则添加新元素会导致删除最旧的元素(具有最高索引的元素)。ArrayList

有人有什么建议吗?


答案 1

List有 add(int, E) 方法,所以你可以使用:

list.add(0, yourObject);

之后,您可以使用以下命令删除最后一个元素:

if(list.size() > 10)
    list.remove(list.size() - 1);

但是,您可能希望重新考虑您的需求或使用不同的数据结构,如队列

编辑

也许看看Apache的CircularFifoQueue

CircularFifoQueue是一个先进先出的队列,具有固定大小,如果已满,则替换其最旧的元素。

只需使用最大大小初始化它:

CircularFifoQueue queue = new CircularFifoQueue(10);

答案 2

使用特定数据结构

有各种数据结构针对在第一个索引处添加元素进行了优化。但请注意,如果您将收藏转换为其中之一,则对话可能需要时间和空间复杂性O(n)

德克

JDK包括Deque结构,它提供了addFirst(e)offerFirst(e)等方法。

Deque<String> deque = new LinkedList<>();
deque.add("two");
deque.add("one");
deque.addFirst("three");
//prints "three", "two", "one"

分析

插入的空间和时间复杂度为常数 ()。请参阅 Big-O 备忘单LinkedListO(1)

反转列表

一个非常简单但效率低下的方法是使用反向:

 Collections.reverse(list);
 list.add(elementForTop);
 Collections.reverse(list);

如果您使用Java 8流,则可能会对此答案感兴趣。

分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

看看JDK实现,这具有时间复杂性,因此仅适用于非常小的列表。O(n)