队列分单向队列和双向队列,单向队列从一端操作使用Queue接口,双向队列从两端操作使用Deque接口。
Queue接口: 抛出异常的方法有add(),remove(),element()获取。
返回特殊值的方法:offer(),poll(),peek()。
Deque接口 : 从头操作与从尾操作,与Queue接口其实大同小异
下面我们首先用单向队列实现一个排队到银行存款的业务。
import java.util.ArrayDeque;
import java.util.Queue;
public class Demo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//System.out.println("123");
Queue<Request> que=new ArrayDeque<Request>();
for(int i=1;i<=10;i++)
{
final int num=i;
que.offer(new Request(){
@Override
public void dopost() {
// TODO Auto-generated method stub
System.out.println("第"+num+"个人,存款"+Math.random()*1000);
}
});
}
dealWith(que);
}
public static void dealWith(Queue<Request> que)
{
Request req=null;
while(null!=(req=que.poll()))
{
req.dopost();
}
}
}
interface Request{
void dopost();
}
这个例子有几点值得说一说:
1.匿名内部类只能引用final变量
2.Queue实现的对象的poll与offerfangfa
下面再来看一个用双向队列实现的堆栈,并用我们自己创建的堆栈类模拟下浏览记录的前进与后退
import java.util.ArrayDeque;
import java.util.Deque;
public class MyStack<E> {
private Deque<E> container=new ArrayDeque<E>();
private int cap;
public MyStack(int cap)
{
super();
this.cap=cap;
}
public boolean push(E e)
{
if(container.size()+1>cap)
{
return false;
}
return container.offerLast(e);
}
public E pop()
{
return container.pollLast();
}
public E peek()
{
return container.peekLast();
}
public int size()
{
return this.container.size();
}
}
首先说说这个堆栈类,我们都知道堆栈和队列的区别在于它先进后出。其实堆栈的实现只需要关心3点,压栈,弹栈,获取头。
我们用一个测试类测了看看
public class Demo02 {
public static void main(String[] args) {
// TODO Auto-generated method stu
MyStack<String> BackHistory=new MyStack<String>(3);
BackHistory.push("baidu");
BackHistory.push("baidu2");
BackHistory.push("baidu3");
BackHistory.push("baidu4");
System.out.println(BackHistory.size());
String item =null;
while(null!=(item=BackHistory.pop()))
{
System.out.println(item);
}
}
}
可以发现其先进后出的特点,并且只能存3个