循环队列,用于保存最新的几个值
在做一个监控,用于保存最新的监控数据,需要一个集合存放监控数据,当集合满的时候,新的监控数据需要把旧的监控给冲掉,只保存最新的监控数据。下面是一个简单的实现
import java.io.Serializable;
/**
* 基于数据实现的循环队列,用于存取最新的固定长度的数据
*
* @author WangJun <wangjuntytl@163.com>
* @version 1.0 15/9/16
* @since 1.6
*/
public class CycleQueue<E> implements Serializable {
/**
* 数组下一个索引位置
*/
private int index;
/**
* 循环队列的大小
*/
private int length;
/**
* 是否队列已处于循环转态
*/
private boolean cycle;
/**
* 存取具体数据的容器
*/
private Object[] data;
/**
* 利用指定大小的值初始化循环队列容器
*
* @param length
*/
public CycleQueue(int length) {
this.length = length;
data = new Object[length];
}
/**
* 线程安全的存入最新值到容器中
*
* @param value
*/
public synchronized void push(E value) {
if (index >= length) {
index = index - length;
cycle = true;
}
data[index] = value;
index++;
}
/**
* 获取目前容器内的所有值
* 注意当集合未满时,未存放值得地方会返回null
*
* @return
*/
public Object[] get() {
Object[] truthData = new Object[length];
int currentIndex = (index - 1);
if (cycle) {
for (int i = (length - 1); i >= 0; i--) {
if (currentIndex < 0) {
truthData[i] = data[currentIndex + length];
} else {
truthData[i] = data[currentIndex];
}
currentIndex--;
}
} else {
return data;
}
return truthData;
}
/**
* 获取容器内的最新值
*
* @return the latest value
*/
public E getCurrentValue() {
int currentIndex = (index - 1);
if (currentIndex < 0) currentIndex = 0;
return (E) data[currentIndex];
}
@Override
public String toString() {
Object[] data = get();
String res = "[ ";
for (Object object : data) {
res += object + ",";
}
res = res.substring(0, res.length() - 1);
res += " ]";
return res;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。