当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

Java实现循环队列

作者:小梦 来源: 网络 时间: 2024-07-03 阅读:

循环队列,用于保存最新的几个值

在做一个监控,用于保存最新的监控数据,需要一个集合存放监控数据,当集合满的时候,新的监控数据需要把旧的监控给冲掉,只保存最新的监控数据。下面是一个简单的实现

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;    }}

热点阅读

网友最爱