Java ArrayDeque实现Stack的功能
在J2SE6引入了ArrayDeque类,它继承了Deque(双向队列)接口,使用此类可以自己实现java.util.Stack类的功能,去掉了java.util.Stack的多线程同步的功能。
例如创建一个存放Integer类型的Stack,只要在类中创建一个ArrayDeque类的变量作为属性,之后定义的出栈、入栈,观察栈顶元素的操作就直接操作ArrayDeque的实例变量即可。
importjava.util.ArrayDeque;
importjava.util.Deque;
publicclassIntegerStack{
privateDeque<Integer>data=newArrayDeque<Integer>();
publicvoidpush(Integerelement){
data.addFirst(element);
}
publicIntegerpop(){
returndata.removeFirst();
}
publicIntegerpeek(){
returndata.peekFirst();
}
publicStringtoString(){
returndata.toString();
}
publicstaticvoidmain(String[]args){
IntegerStackstack=newIntegerStack();
for(inti=0;i<5;i++){
stack.push(i);
}
System.out.println(stack);
System.out.println("Afterpushing5elements:"+stack);
intm=stack.pop();
System.out.println("Poppedelement="+m);
System.out.println("Afterpopping1element:"+stack);
intn=stack.peek();
System.out.println("Peekedelement="+n);
System.out.println("Afterpeeking1element:"+stack);
}
}
java.util.ArrayDeque的源码:
privatetransientE[]elements;
privatetransientinthead;
privatetransientinttail;
/*此处存放e的位置是从elements数组最后的位置开始存储的*/
publicvoidaddFirst(Ee){
if(e==null)
thrownewNullPointerException();
elements[head=(head-1)&(elements.length-1)]=e;//首次数组容量默认为16,head=(0-1)&(16-1)=15
if(head==tail)
doubleCapacity();
}
/*每次扩容都按插入的先后顺序重新放入一个新的数组中,最新插入的放在数组的第一个位置。*/
privatevoiddoubleCapacity(){
asserthead==tail;
intp=head;
intn=elements.length;
intr=n-p;//numberofelementstotherightofp
intnewCapacity=n<<1;
if(newCapacity<0)
thrownewIllegalStateException("Sorry,dequetoobig");
Object[]a=newObject[newCapacity];
System.arraycopy(elements,p,a,0,r);
System.arraycopy(elements,0,a,r,p);
elements=(E[])a;
head=0;
tail=n;
}
publicEremoveFirst(){
Ex=pollFirst();
if(x==null)
thrownewNoSuchElementException();
returnx;
}
publicEpollFirst(){
inth=head;
Eresult=elements[h];//Elementisnullifdequeempty
if(result==null)
returnnull;
elements[h]=null;//重新设置数组中的这个位置为null,方便垃圾回收。
head=(h+1)&(elements.length-1);//将head的值回退,相当于将栈的指针又向下移动一格。例如,12--〉13
returnresult;
}
publicEpeekFirst(){
returnelements[head];//elements[head]isnullifdequeempty
}
以上就是本文的全部内容,希望对大家学习java程序设计有所帮助。