Java 获取第i个元素时FIFO实现的数据结构

Java 获取第i个元素时FIFO实现的数据结构,java,performance,fifo,Java,Performance,Fifo,我想要一个数据结构,将是固定大小,并将作为先进先出。我的意思是,如果大小超过第一个元素,将被删除。每次插入后,我还要检查该结构的中间元素(即大小为21的第10个元素) 我考虑使用ARARYDEQUE,但DEQI接口不考虑顺序。i、 e.获取第i个元素) 我将把它用于一个耗时的过程,性能对我来说很重要。我建议的数据结构是什么?您可以使用LinkedList LinkedList实现队列接口(FIFO),但您也可以在队列中的特定位置获取项目 例如: LinkedList<Object>

我想要一个数据结构,将是固定大小,并将作为先进先出。我的意思是,如果大小超过第一个元素,将被删除。每次插入后,我还要检查该结构的中间元素(即大小为21的第10个元素)

我考虑使用ARARYDEQUE,但DEQI接口不考虑顺序。i、 e.获取第i个元素)


我将把它用于一个耗时的过程,性能对我来说很重要。我建议的数据结构是什么?

您可以使用
LinkedList

LinkedList实现队列接口(FIFO),但您也可以在队列中的特定位置获取项目

例如:

LinkedList<Object> queue = new LinkedList<Object>();

public void insertObject(Object o)
{
   int middleElement = queue.size/2;
   if(queue.size > 20) //If full
   {
        queue.Poll(); //remove the first element
        queue.Offer(o); //Adds the element
        print(queue.Get(middleElement)); //Print the middle element

   }
   else //If not full
   {
      queue.Offer(o); //Adds the element
      print(queue.Get(middleElement)); //Print the middle element

   }
}
LinkedList队列=新建LinkedList();
公共void插入对象(对象o)
{
int middleElement=queue.size/2;
if(queue.size>20)//如果已满
{
queue.Poll();//删除第一个元素
queue.Offer(o);//添加元素
打印(queue.Get(middleElement));//打印中间元素
}
否则//如果未满
{
queue.Offer(o);//添加元素
打印(queue.Get(middleElement));//打印中间元素
}
}

让我们假设我们讨论的是通常包含大量元素的FIFO

  • ArrayList不是一个好的选择,因为删除列表开头的元素是一个
    O(N)
    操作。(对于包含N个元素的列表)

  • LinkedList可能不是一个好的选择,因为获取第N个元素是一个
    O(N)
    操作

我认为您需要一个由数组支持的循环缓冲区。这将为您提供
O(1)
FIFO插入、
O(1)
FIFO删除,以及
O(1)
索引
从FIFO开始获取元素
i
。循环缓冲区行为使用两个索引实现,一个用于队列开始位置,另一个用于队列结束位置。插入和删除只涉及移动一个或另一个索引,而
get(i)
归结为
backingArray[(startPos+i)%backingArray.length]
的获取,并进行一些错误检查

如果您需要FIFO是可扩展的,您可以通过将备份阵列的大小增加一倍来实现这一点。。。并且仍然得到摊销
O(1)
用于插入、删除和索引



我认为Apache Commons类符合您对固定大小FIFO案例的要求。它包括一个获取第i个元素的
get(i)
方法。

问题是链表上的
get(i)
涉及以下
i
链接。为什么不将ArrayList子类化并将自己的边界逻辑放入
add
方法中呢?因为这样会有效地删除FIFO的头元素。