Table of Contents
In my spare time lately I’ve been writing this Android football game, and for the game I needed a simple FIFO queue. I haven’t used Java much lately, and after a quick Google search showed things that were more complicated than what I had in mind, I wrote my own FIFO queue.
FIFO queue with a size limit
This isn’t a pure FIFO queue in that I wanted to limit the number of elements that could be kept in the queue. The way it should work is that if I add more elements than the queue can contain, the queue should silently drop the oldest (first-in) element.
That being said, the source code shown below is very easily made into a more simple FIFO queue, as shown at the end of this article.
I named my new class FifoQueueWithLimitedSize, and I create an instance of it like this:
private final FifoQueueWithLimitedSize<String> previousOffensivePlays = new FifoQueueWithLimitedSize<>(3);
Here I create previousOffensivePlays to keep track of the last three plays called by the computer when it’s running the offense. Later on I add elements to the queue like this:
previousOffensivePlays.put(currentOffensivePlay);
Given that introduction of how to use this FIFO queue, here’s the Java source code for it:
import java.util.LinkedList;
import java.util.List;
/**
* A FIFO queue, written by Alvin Alexander (http://alvinalexander.com).
*
* As its name implies, this is a first-in, first-out queue.
*
* I developed this class for a football game I'm writing, where I want to remember
* a limited number of plays that the "Computer Offensive Coordinator" has
* previously called. The current need is that I don't want the computer calling
* the same play three times in a row.
*
* I was going to add a `reverse` method here, but you can do that in Java with
* `Collections.reverse(list)`, so I didn't think there was a need for it.
*
*/
public class FifoQueueWithLimitedSize<E> {
private List<E> list = new LinkedList<>();
private int maxSize = 3;
public FifoQueueWithLimitedSize(int maxSize) {
this.maxSize = maxSize;
}
public void put(E e) {
list.add(e);
if (list.size() > maxSize) list.remove(0);
}
/**
* can return `null`
*/
public E pop() {
if (list.size() > 0) {
E e = list.get(0);
list.remove(0);
return e;
} else {
return null; //but have a nice day
}
}
/**
* @throws IndexOutOfBoundsException
*/
public E peek() {
return list.get(0);
}
public boolean contains(E e) {
return list.contains(e);
}
/**
* @throws IndexOutOfBoundsException
*/
public E get(int i) {
return list.get(i);
}
public List<E> getBackingList() {
// return a copy of the list
return new LinkedList<>(list);
}
public void clear() {
list.clear();
}
public boolean isEmpty() {
return list.isEmpty();
}
// mostly needed for testing atm
public int size() {
return list.size();
}
}
Some of those methods might not be used by a traditional queue, but they helped make my life a little easier, so I added them.
FIFO queue tests
I didn’t test the queue code too hard, but FWIW, here is one series of unit tests that I wrote for it:
public void testMaxQueueSizeWorks() throws Exception {
FifoQueueWithLimitedSize<String> q = new FifoQueueWithLimitedSize<>(3);
assertEquals("initial queue size is 0", 0, q.size());
q.put("a");
assertEquals("size after adding 'a' element is 1", 1, q.size());
q.put("b");
assertEquals("size after adding 'b' element is 2", 2, q.size());
q.put("c");
assertEquals("size after adding 'c' element is 3", 3, q.size());
q.put("d");
assertEquals("size after adding 'd' element is still 3", 3, q.size());
q.put("e");
assertEquals("size after adding 'e' element is still 3", 3, q.size());
assertEquals("element 0 should be 'c'", "c", q.get(0));
assertEquals("element 1 should be 'd'", "d", q.get(1));
assertEquals("element 2 should be 'e'", "e", q.get(2));
}
I like test code because it helps to serve as documentation for the source code that’s being tested, and in this case it helps to show how I expect this queue to work.
A “regular” FIFO queue
Note that this class is easily modified to be a FIFO queue without a size limit. You only need to change a few lines of code to make that happen. In fact, what the heck, here are those changes that give you a “regular” Java FIFO queue:
public class FifoQueue<E> {
private List<E> list = new LinkedList<>();
public void put(E e) {
list.add(e);
}
/**
* can return `null`
*/
public E pop() {
if (list.size() > 0) {
E e = list.get(0);
list.remove(0);
return e;
} else {
return null; //but have a nice day
}
}
/**
* @throws IndexOutOfBoundsException
*/
public E peek() {
return list.get(0);
}
public boolean contains(E e) {
return list.contains(e);
}
/**
* @throws IndexOutOfBoundsException
*/
public E get(int i) {
return list.get(i);
}
public List<E> getBackingList() {
// return a copy of the list
return new LinkedList<>(list);
}
public void clear() {
list.clear();
}
public boolean isEmpty() {
return list.isEmpty();
}
// mostly needed for testing atm
public int size() {
return list.size();
}
}
Note that the pop behavior in this class is different than a Java LinkedList, which works like a stack. This code pops the first (0th) element off of the queue.
Summary
In summary, if you were looking for some Java source code for a FIFO queue, I hope this code is helpful.

