Queue

て烟熏妆下的殇ゞ 提交于 2020-04-18 14:45:53

定义

队列是一种特殊的线性表,先进先出,它只允许在表的前端进行删除,在表的后端进行插入。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。


简单一个小 Demo


public static Queue<String>  queueDemo(){
    Queue<String> queue = new LinkedList<String>();
    //添加元素
    queue.offer("f");
    queue.offer("r");
    queue.offer("o");
    queue.offer("z");
    queue.offer("e");
    queue.offer("n");
    //add()和remove()方法在失败的时候会抛出异常(不推荐)
    queue.add("redant");
    queue.remove("b");
    for(String q : queue){
        System.out.println("逐个遍历Queue中的元素:"+q);
    }
    System.out.println("删除队列中的第一个元素,poll:"+queue.poll());
    System.out.println("队列中的第一个元素,element:"+queue.element());
    System.out.println("队列中的第一个元素,peek:"+queue.peek());
    return queue;
}
    //1、Queue队列测试
Queue<String> sss =  QueueDemo.queueDemo();
 for(String q : sss){
     System.out.println(q);
 }

Queuedemo.png

说明

add        增加一个元索                    如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove   移除并返回队列头部的元素    如果队列为空,则抛出一个NoSuchElementException异常
element  返回队列头部的元素             如果队列为空,则抛出一个NoSuchElementException异常
offer       添加一个元素并返回true       如果队列已满,则返回false
poll         移除并返问队列头部的元素    如果队列为空,则返回null
peek       返回队列头部的元素             如果队列为空,则返回null
put         添加一个元素                     如果队列满,则阻塞
take        移除并返回队列头部的元素     如果队列为空,则阻塞






堆、栈、队列之间的区别是?

①堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(后进先出)

③队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)


队列之ArrayBlockingQueue测试小demo

ArrayBlockingQueue:需要制定容量,可选择是否需要公平性,等待时间长的线程优先执行。

/**
 * 一辆家庭小轿车
 */
public static class FrozenCar{
    // 这辆车子,最多容纳5个人{包括司机}
    BlockingQueue<String> frozenCar = new ArrayBlockingQueue<String>(5);
    // 开始shungfeng车,拉人
    public void carrerPosal() throws InterruptedException{
        // put方法载入一个人,若frozenCar满了,等到frozenCar有位置
        frozenCar.put("pretty girl");
    }
    // 乘客到站,从frozenCar中下车
    public String consume() throws InterruptedException{
        // get方法取出一个乘客,若frozenCar为空,等到frozenCar有苹果为止
        String apple = frozenCar.take();
        return apple;
    }
    public int getPosalNumber(){
        return frozenCar.size();
    }
}
// 测试方法
public static void testFrozenCar() {
    // 买一辆车
    final FrozenCar frozencar = new FrozenCar();
    // 定义乘客
    class Producer implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    System.out.println("准备拉乘客:" + System.currentTimeMillis());
                    frozencar.carrerPosal();
                    System.out.println("乘客已上车:" + System.currentTimeMillis());
                    System.out.println("车上还有:"+frozencar.getPosalNumber()+"人");
                    Thread.sleep(1000);   // 休眠1秒
                }
            } catch (InterruptedException ex) {
            }
        }
    }
    // 定义乘客
    class Consumer implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    System.out.println("乘客要下车:" + System.currentTimeMillis());
                    frozencar.consume();
                    System.out.println("乘客已下车:" + System.currentTimeMillis());
                    System.out.println("车上还有:"+frozencar.getPosalNumber()+"人");
                    Thread.sleep(1000);// 休眠1s
                }
            } catch (InterruptedException ex) {
            }
        }
    }
    ExecutorService service = Executors.newCachedThreadPool();
    Producer producer = new Producer();
    Consumer consumer = new Consumer();
    service.submit(producer);
    service.submit(consumer);
    // 程序运行10s后,所有任务停止
    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
    }
    service.shutdownNow();
}
//2、ArrayBlockingQueue测试
QueueDemo.testFrozenCar();


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!