今天来说说java的队列和栈,java没有专门的搞个类来写这个队列,有个stack的类是继承vector的,vector就是一个各个方法加了synchronized的arraylist,也就是线程安全的数组,而它的stack也是基于数组的,所以使用起来也相对难受,然后这个vector和stack都是jdk1.0时代的api,目前都有相应的代替的api,所以对其不进行学习。现在的java的队列和栈都是把它们封装在了linkedlist里面。众所周知,linkedlist是一个双向链表,操作起来非常方便,java也封装了很多的方法在这个双向链表里面。一定要自己去看看源码,不然很难理解里面的精髓。话不多说,直接上代码。
首先是队列,即FIFO模型。
public static void main(String[] args) {
Queue q1 = new LinkedList<>();
q1.offer("aa");
q1.offer("bb");
q1.offer("cc");
while (q1.peek() != null) {
System.out.println(q1.poll());
}
}
输出是
然后我们来看源码,队列接口里面的方法有6个
大家看看英文也大概看懂他们的区别了,前面三个在为空的时候会报异常的,
add()会在长度不够时抛出异常:IllegalStateException; offer()则不会,只返回false
element()会在没元素时抛出异常:NoSuchElementException; peek()返回null;
remove()会在没元素时抛出异常:NoSuchElementException; poll()返回null;
所以我前面都是用后面的三个方法,这样就不报错了。然后看输出也很正常,符合队列的数据结构。反正大家就是要多看源码,看注释说明也好。
然后来看栈,FILO模型。这里就不是stack接口了,现在的java把它封装在了deque接口里面。
public static void main(String[] args) {
Deque s1 = new LinkedList<>();
s1.push("aa");
s1.push("bb");
s1.push("cc");
while (s1.peek() != null) {
System.out.println(s1.poll());
}
}
输出是:
结果符合。然后看源码。
然后看着就忽然发现自己理解java是怎么实现这些结构的了吧。没错,其实java就是利用双向链表里面的方法,从前面和后面去操作这个双向链表,然后把方法再封装成和队列和栈的方法的功能类似,就这样。有兴趣的话自己去试试。
关键是要对linkedlist足够的熟悉。
欢迎交流讨论。