定义
队列是一种特殊的线性表,先进先出,它只允许在表的前端进行删除,在表的后端进行插入。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();
来源:oschina
链接:https://my.oschina.net/u/4340449/blog/3274144