Ring Buffer in Java

Consider CircularFifoBuffer from Apache Common.Collections. Unlike Queue you don’t have to maintain the limited size of underlying collection and wrap it once you hit the limit.

Buffer buf = new CircularFifoBuffer(4);
buf.add("A");
buf.add("B");
buf.add("C");
buf.add("D"); //ABCD
buf.add("E"); //BCDE

CircularFifoBuffer will do this for you because of the following properties:

  • CircularFifoBuffer is a first in first out buffer with a fixed
    size
    that replaces its oldest element if full.
  • The removal order of a CircularFifoBuffer is based on the insertion
    order; elements are removed in the same order in which they were
    added. The iteration order is the same as the removal order.
  • The add(Object), BoundedFifoBuffer.remove() and
    BoundedFifoBuffer.get() operations all perform in constant time.
    All other operations perform in linear time or worse.

However you should consider it’s limitations as well – for example, you can’t add missing timeseries to this collection because it doens’t allow nulls.

NOTE: When using current Common Collections (4.*), you have to use Queue. Like this:

Queue buf = new CircularFifoQueue(4);

Leave a Comment