JDK7中的双端队列Deque实现
2016-05-04 16:29
621 查看
JDK7中的双端队列Deque实现
双端队列Deque(全名double-ended queue)是一种数据结构,可在双端队列的两端插入、获取或删除元素。队列和栈可以认为是双端队列的特列。
Deque常用的方法:
Deque扩展了Queue接口,当Deque用作FIFO队列时,元素从双端队列队尾加入,从队首移出。从Queue接口继承的方法等同于Deque如下方法:
Deques也可作为LIFO栈。该接口应该优先于遗留的Stack类使用。当双端队列用作栈时,元素从队首入栈和出栈。Stack方法等同与Deque如下方法:
Note that the peek method works equally well when a deque is used as a queue or a stack; in either case, elements
are drawn from the beginning of the deque.
ArrayDeque: 一个基于可变长度数组实现的无界双端队列。不允许null元素。
就效率而言,ArrayDeque在两端添加或删除元素时比LinkedList更高效。ArrayDeque用作栈时比Stack更快,用作队列时比LinkedList更快。
LinkedList实现比ArrayDeque实现更复杂,耗费更多的内存。当遍历双端列表时删除当前元素,LinkedList比ArrayDeque更高效。
继承BlockingQueue的BlockingDeque接口及其实现LinkedBlockingDeque:一个基于链接节点实现的可选有界双端队列。如果LinkedBlockingDeque在构造时没有设定容量大小,添加元素永远不会有阻塞队列的等待(至少在其中有Integer.MAX_VALUE 元素之前不会)。
LinkedBlockingDeque实现采用一个独占锁,所有对队列的操作都进行了锁保护,因而很好的支持双向阻塞的特性。缺点是由于独占锁,所以不能同时进行两个操作,这样性能上就大打折扣。
LinkedBlockingDeque实现具有显对低的开销及相对低的可扩展性。如果仅需要FIFO队列功能,最好使用LinkedBlockingQueue,LinkedBlockingQueue具有相同的开销但是有更好的伸缩性(例如很多线程竞争时保持更好的性能)。 http://www.blogjava.net/xylz/archive/2010/08/12/328587.html http://www.blogjava.net/xylz/archive/2010/08/18/329227.html
ConcurrentLinkedDeque具有跟LinkedBlockingDeque相反的表现:相对高的开销及很好的可伸缩性(使用CAS操作进行非堵塞操作,减少了锁的开销,避免序列化瓶颈)。 http://cs.oswego.edu/pipermail/concurrency-interest/2004-November/001140.html
回文检查方案是采用Deque存储字符串的字符,将字符串中的字符从左到右插入Deque尾部,则deque头部将持有字符串的首字符,deque尾部将持有字符串的末字符。然后从Deque两端移出字符进行比较,直到Deque内字符数为0或1为止。
双端队列Deque(全名double-ended queue)是一种数据结构,可在双端队列的两端插入、获取或删除元素。队列和栈可以认为是双端队列的特列。
Deque常用的方法:
First Element (Head) | Last Element (Tail) | |||
Throws exception | Special value | Throws exception | Special value | |
Insert | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
Remove | removeFirst() | pollFirst() | removeLast() | pollLast() |
Examine | getFirst() | peekFirst() | getLast() | peekLast() |
Queue Method | Equivalent Deque Method |
add(e) | addLast(e) |
offer(e) | offerLast(e) |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
Stack Method | Equivalent Deque Method |
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
are drawn from the beginning of the deque.
JDK6加入的Deque实现
LinkedList: 一个基于链接节点实现的无界双端队列。允许null元素。ArrayDeque: 一个基于可变长度数组实现的无界双端队列。不允许null元素。
就效率而言,ArrayDeque在两端添加或删除元素时比LinkedList更高效。ArrayDeque用作栈时比Stack更快,用作队列时比LinkedList更快。
LinkedList实现比ArrayDeque实现更复杂,耗费更多的内存。当遍历双端列表时删除当前元素,LinkedList比ArrayDeque更高效。
继承BlockingQueue的BlockingDeque接口及其实现LinkedBlockingDeque:一个基于链接节点实现的可选有界双端队列。如果LinkedBlockingDeque在构造时没有设定容量大小,添加元素永远不会有阻塞队列的等待(至少在其中有Integer.MAX_VALUE 元素之前不会)。
LinkedBlockingDeque实现采用一个独占锁,所有对队列的操作都进行了锁保护,因而很好的支持双向阻塞的特性。缺点是由于独占锁,所以不能同时进行两个操作,这样性能上就大打折扣。
LinkedBlockingDeque实现具有显对低的开销及相对低的可扩展性。如果仅需要FIFO队列功能,最好使用LinkedBlockingQueue,LinkedBlockingQueue具有相同的开销但是有更好的伸缩性(例如很多线程竞争时保持更好的性能)。 http://www.blogjava.net/xylz/archive/2010/08/12/328587.html http://www.blogjava.net/xylz/archive/2010/08/18/329227.html
JDK7加入的Deque实现
ConcurrentLinkedDeque:一个基于链接节点实现的无界无阻塞双端队列。收集关于队列大小的信息会很慢,需要遍历队列。ConcurrentLinkedDeque具有跟LinkedBlockingDeque相反的表现:相对高的开销及很好的可伸缩性(使用CAS操作进行非堵塞操作,减少了锁的开销,避免序列化瓶颈)。 http://cs.oswego.edu/pipermail/concurrency-interest/2004-November/001140.html
Deque应用:回文(Palindrome)检查
Deque的应用不是很多,很容易使用双端队列解决的一个有趣问题是经典的回文问题。回文是正着读和倒着读都一样的字符串,例如radar、toot和madam。回文检查方案是采用Deque存储字符串的字符,将字符串中的字符从左到右插入Deque尾部,则deque头部将持有字符串的首字符,deque尾部将持有字符串的末字符。然后从Deque两端移出字符进行比较,直到Deque内字符数为0或1为止。
public class PalindromeChecker { public static boolean palchecker(String str) { if(str==null || str.isEmpty()) return false; ArrayDeque aDeque = new ArrayDeque (str.length()); for(int i=0;i char ch = str.charAt(i); aDeque.addLast(new Character(ch)); } boolean res = true; while (aDeque.size()>1 && res) { Character first = aDeque.removeFirst(); Character last = aDeque.removeLast(); if(!first.equals(last)) res = false; } return res; } public static void main(String[] args) { System.out.println(palchecker("lsdkjfskf")); System.out.println(palchecker("radar")); } }
相关文章推荐
- spring jdbc template 自己的笔记
- java中的String.split() 中“|”作为分隔符的问题和数组长度问题
- 最大堆和最小堆求数据流中的中位数【java实现】
- Java Marker Interface
- Android路径与Eclipse File Explorer查看路径位置对应
- java 冒泡排序 插入排序 选择排序
- 图文讲解Java中实现quickSort快速排序算法的方法
- 完整的Java简单浏览器
- java即时编译器JIT之简单介绍
- java.lang.NoSuchFieldError: INSTANCE
- Google 推出的 Java 编码规范(转)
- java工具类一些应用
- JNI调用java接口函数
- 使用RadioGroup实现底部导航栏效果,不需要java代码。
- java集合框架之List接口运用排序
- Javase基础----List部分方法总结
- 【LeetCode】345 Reverse Vowels of a String(java)
- hdu4504java
- java 使用自定义元组
- JavaWeb学习总结(五十一)——邮件的发送与接收原理