java 用什么实现 FIFO队列?

 我来答
小傻

2015-11-01 · 知道合伙人软件行家
小傻
知道合伙人软件行家
采纳数:11567 获赞数:31135
已经做过两个上架的app和两个网页项目.

向TA提问 私信TA
展开全部

java使用数据结构来实现FIFO先进先出的队列,实例如下:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package linkedlisttest;

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Vicky.H
 * @email eclipser@163.com
 */
public class FIFOTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        FIFO<A> fifo = new FIFOImpl<A>(5);
        for (int i = 0; i < 20; i++) {
            A a = new A("A:" + i);
            A head = fifo.addLastSafe(a);
            System.out.println(i + "\thead:" + head + "\tsize:" + fifo.size());
        }

        System.out.println("---------------");

        System.out.println("弹出数据");
        List<A> polls = fifo.setMaxSize(3);
        for (A a : polls) {
            System.out.println("\thead:" + a);
        }
        
        System.out.println("剩余数据");
        for (A a : fifo) {
            System.out.println("\thead:" + a);
        }
        System.out.println(fifo.size());
    }
}

interface FIFO<T> extends List<T>, Deque<T>, Cloneable, java.io.Serializable {

    /**
     * 向最后添加一个新的,如果长度超过允许的最大值,则弹出一个 *
     */
    T addLastSafe(T addLast);

    /**
     * 弹出head,如果Size = 0返回null。而不同于pop抛出异常
     * @return 
     */
    T pollSafe();

    /**
     * 获得最大保存
     *
     * @return
     */
    int getMaxSize();

    /**
     * 设置最大存储范围
     *
     * @return 返回的是,因为改变了队列大小,导致弹出的head
     */
    List<T> setMaxSize(int maxSize);

}

class FIFOImpl<T> extends LinkedList<T> implements FIFO<T> {

    private int maxSize = Integer.MAX_VALUE;
    private final Object synObj = new Object();

    public FIFOImpl() {
        super();
    }

    public FIFOImpl(int maxSize) {
        super();
        this.maxSize = maxSize;
    }

    @Override
    public T addLastSafe(T addLast) {
        synchronized (synObj) {
            T head = null;
            while (size() >= maxSize) {
                head = poll();
            }
            addLast(addLast);
            return head;
        }
    }

    @Override
    public T pollSafe() {
        synchronized (synObj) {
            return poll();
        }
    }

    @Override
    public List<T> setMaxSize(int maxSize) {
        List<T> list = null;
        if (maxSize < this.maxSize) {
            list = new ArrayList<T>();
            synchronized (synObj) {
                while (size() > maxSize) {
                    list.add(poll());
                }
            }
        }
        this.maxSize = maxSize;
        return list;
    }

    @Override
    public int getMaxSize() {
        return this.maxSize;
    }
}

class A {

    private String name;

    public A() {
    }

    public A(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "A{" + "name=" + name + '}';
    }
}
Hi_c
2012-12-17 · TA获得超过142个赞
知道小有建树答主
回答量:173
采纳率:0%
帮助的人:99.8万
展开全部
java已经有先进先出队列的实现了啊,不需要自己再实现~
更多追问追答
追问
上面我可能没有描述清楚:
我现在有一个功能需要FIFO操作,用java的什么来解决?
追答
其实第一个人已经回答你了,java中德Queue接口定义的就是队列的数据结构,LinkedList类已经实现了Queue接口,直接使用LinkedList类就可以了,你可以查阅一下JDK API文档
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我是北堂风
2012-12-17 · TA获得超过594个赞
知道小有建树答主
回答量:657
采纳率:0%
帮助的人:275万
展开全部
先进先出不就是队列么
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
素尔琴
2012-12-17 · 超过16用户采纳过TA的回答
知道答主
回答量:32
采纳率:0%
帮助的人:30.2万
展开全部
Queue q = new LinkedList();
更多追问追答
追问
LIFO队列java中已经用什么实现了
追答
Stack s = new Stack();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式