Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

8.9. Queue

		
	Queue<String> queue = new Queue<String>();
	queue.offer("1");
	queue.offer("2");
	queue.offer("3");
	queue.offer("4");
	System.out.println("当前第一个元素: " + queue.peek());// 取队列第一个元素
	System.out.println("出列第一个元素: " + queue.poll());// 出列第一个元素
	System.out.println("当前第一个元素: " + queue.peek());// 取队列第一个元素		
		
		

8.9.1. 阻塞队列

阻塞队列是一个可以阻塞的先进先出集合,比如某个线程在空队列获取元素时、或者在已存满队列存储元素时,都会被阻塞。

BlockingQueue 接口常用的实现类如下:



ArrayBlockingQueue :基于数组的有界阻塞队列,必须指定大小。
LinkedBlockingQueue :基于单链表的无界阻塞队列,不需指定大小。
PriorityBlockingQueue :基于最小二叉堆的无界、优先级阻塞队列。
DelayQueue:基于延迟、优先级、无界阻塞队列。
SynchronousQueue :基于 CAS 的阻塞队列。

8.9.2. 

			
        LinkedBlockingQueue<Integer> sequence = new LinkedBlockingQueue<Integer>() {{
            add(10);
            add(50);
            add(100);
            add(1000);
        }};			
			
			
				
	LinkedBlockingQueue<String> voice = new LinkedBlockingQueue<String>();
    voice.add("第一句,你是哪里的人");
    voice.add("第二句,你住在哪里啊");
    voice.add("第三句,你叫什么名字");
    voice.add("第四句,你从事什么职业");
    voice.add("第五句,问完了");				
				
			

8.9.3. Deque 双端队列

			
public class Main  {
    public static void main(String[] args) {

        Deque deque = new LinkedList<String>();
        deque.push("one");
        deque.push("two");
        deque.push("three");
        while (deque.peek() != null) 
             System.out.println(deque.pop());
    }
}			
			
			

8.9.3.1. LinkedList

			
public class QueueTest {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList();
        queue.offer("元素A");
        queue.offer("元素B");
        queue.offer("元素C");
        queue.offer("元素D");
        queue.offer("元素E");
        while (queue.size() > 0) {
            String element = queue.poll();
            System.out.println(element);
        }
    }
}
			
				
			
package cn.netkiller.test;

import java.util.LinkedList;
import java.util.Queue;

public class QueueTest {
    public static void main(String[] args) {

        Queue<String> queue = new LinkedList<String>();
        //添加元素
        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        queue.offer("d");
        queue.offer("e");
        
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("element="+queue.element()); //返回第一个元素 
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("peek="+queue.peek()); //返回第一个元素 
        for(String q : queue){
            System.out.println(q);
        }
        //add()和remove()方法在失败的时候会抛出异常(不推荐)
    }
}
			
				
			
public class Main {
    public static void main(String[] args) {
        LinkedList queue = new LinkedList();
        queue.add(1);
        queue.add(2);
        queue.add(3);

        //FIFO 先进先出 通过removeFirst()验证一下
        while (!queue.isEmpty())
            System.out.println(queue.removeFirst());
    }
}
			
public class Main {
    public static void main(String[] args) {
        LinkedList queue = new LinkedList();
        queue.add(1);
        queue.add(2);
        queue.add(3);

        // 当作栈区使用 removeLast() 先进后出
        while (!queue.isEmpty())
            System.out.println(queue.removeLast());
    }
}

输出结果
3
2
1			
			
				

8.9.4. 数据转换

			
		String str = "酒店坐落于青岛崂山区金融CBD,背靠历史悠久的“海上名山第一”崂山,迎黄海湾峡绵延悠长。风景秀美壮观,于酒店眺望闻名于世的青岛石老人景观,清风朗日浪花缱绻让人沉醉。国际娱乐标杆美高梅集团精心打造334间奢华畅阔客房,成为同城豪华旅居全新乐选之地。酒店拥有五间风格迥异餐厅、酒吧吧及糕点屋,资深大厨呈现五洲美食,惊喜不绝。";
        String[] arr = str.split("。");
        LinkedBlockingQueue<String> voice = new LinkedBlockingQueue<String>(Arrays.asList(arr));			
			
			

8.9.5. PriorityBlockingQueue