我正在寻找一个实现Collection
的Java类,当我add()
一个新元素时,如果元素的总数大于X,则会丢失最旧的元素。它是否存在或我必须自己实现它?
我需要一个线程安全的。
答案 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来实现移动平均功能。
虽然它不是线程安全的。