在add()上丢失最旧元素的集合

时间:2014-07-31 13:07:43

标签: java

我正在寻找一个实现Collection的Java类,当我add()一个新元素时,如果元素的总数大于X,则会丢失最旧的元素。它是否存在或我必须自己实现它?

我需要一个线程安全的。

4 个答案:

答案 0 :(得分:6)

如果您正在寻找列表类型解决方案,除了Linkedhashmap之外,Google番石榴还有EvictingQueue。为了线程安全,您必须将其包装在同步包装器中(Queues#synchronizedQueue)。

EvictingQueue<String> q = EvictingQueue.create(3);
Queue<String> syncQ =  Queues.synchronizedQueue(q);
syncQ.add("one");
syncQ.add("two");
syncQ.add("three");
syncQ.add("four");
System.out.println(q); // Prints [two, three, four]

答案 1 :(得分:3)

  

CircularFifoQueue是一个先进先出队列,其大小固定,可替代其中   最古老的元素,如果它已满。

答案 2 :(得分:2)

你可以使用LinkedHashMap来做到这一点,引用Javadoc:

// Sample use: this override will allow the map to grow up to 100 entries and then delete the 
// eldest entry each time a new entry is added, maintaining a steady state of 100 entries.

 private static final int MAX_ENTRIES = 100;

 protected boolean removeEldestEntry(Map.Entry eldest) {
    return size() > MAX_ENTRIES;
 }

对于线程安全,您可以使用Collections.synchronizedmap()包装它。

答案 3 :(得分:0)

我曾使用Google Guava第15版添加的EvictingQueue来实现移动平均功能。

虽然它不是线程安全的。