定义
队列是一种特殊的线性表,先进先出,它只允许在表的前端进行删除,在表的后端进行插入。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); }
说明
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();