我有一个流时间序列,我有兴趣保留最后4个元素,这意味着我希望能够弹出第一个元素,并添加到最后。本质上,我需要的是一个。
哪种Java集合是最好的?向量?
发布于 2011-09-01 12:38:07
考虑一下Apache Common.Collections中的CircularFifoBuffer。与Queue不同,您不必保持底层集合的有限大小,并在达到限制时对其进行包装。
Buffer buf = new CircularFifoBuffer(4);
buf.add("A");
buf.add("B");
buf.add("C");
buf.add("D"); //ABCD
buf.add("E"); //BCDE由于以下属性,CircularFifoBuffer将为您执行此操作:
(Object),BoundedFifoBuffer.remove()和BoundedFifoBuffer.get()操作都在固定时间内执行。所有其他操作的执行时间都是线性的,甚至更糟。
然而,你也应该考虑到它的局限性-例如,你不能向这个集合中添加缺少的timeseries,因为它不允许空值。
注意:当使用当前队列(4.*)时,您必须使用Common Collections。如下所示:
Queue buf = new CircularFifoQueue(4);发布于 2013-12-12 23:38:39
从Guava15.0(2013年9月发布)开始,就有了EvictingQueue
一个非阻塞队列,当尝试向队列添加新元素时,当队列已满时,它会自动从队列头部逐出元素。驱逐队列必须配置最大大小。每次将元素添加到已满队列中时,队列都会自动删除其头元素。这与传统的有界队列不同,传统的有界队列在满时要么阻塞新元素,要么拒绝新元素。
此类不是线程安全的,并且不接受null元素。
示例用法:
EvictingQueue<String> queue = EvictingQueue.create(2);
queue.add("a");
queue.add("b");
queue.add("c");
queue.add("d");
System.out.print(queue); //outputs [c, d]发布于 2012-08-07 16:37:57
从Java1.6开始,出现了ArrayDeque,它实现了Queue,看起来比LinkedList更快,内存效率更高,并且没有ArrayBlockingQueue的线程同步开销: API文档中写道:“这个类用作堆栈时可能比stack快,用作队列时比LinkedList快。”
final Queue<Object> q = new ArrayDeque<Object>();
q.add(new Object()); //insert element
q.poll(); //remove elementhttps://stackoverflow.com/questions/7266042
复制相似问题