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程序设计有所帮助。