java中queue的使用

本文介绍Java中Queue接口的使用方式及注意事项,展示了如何利用LinkedList实现队列功能,并提供了示例代码。

注意这里的LinkedList不是线程安全的,Vector才是线程安全的
java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。

Queue使用时要尽量避免Collectionadd()remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优

点是通过返回值可以判断成功与否,add()remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用

element()或者peek()方法。

值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

view plaincopy to clipboardprint?

小例子:   

 

/** 

 * 

 * @author Zang XT 

 */ 

import java.util.Queue;  

import java.util.LinkedList;  

public class TestQueue {  

    public static void main(String[] args) {  

        Queue<String> queue = new LinkedList<String>();  

        queue.offer("Hello");  

        queue.offer("World!");  

        queue.offer("你好!");  

        System.out.println(queue.size());  

        String str;  

        while((str=queue.poll())!=null){  

            System.out.print(str);  

        }  

        System.out.println();  

        System.out.println(queue.size());  

    }  

} 

 

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/guijava/archive/2009/01/15/3784658.aspx

### Java Queue接口及其实现类详解 #### 定义与基本特性 Java中的`Queue`接口表示一种通常遵循先进先出(FIFO, First In First Out)原则的数据结构,尽管如此,某些特殊类型的队列可能采用不同的插入、提取或遍历顺序[^2]。此接口属于Java集合框架的一部分,并扩展了`Collection`接口。 #### 方法概览 为了支持队列特有的行为模式——即元素入队(enqueue)和出队(dequeue),以及访问但不移除头部元素的操作,`Queue`接口提供了一系列方法。这些方法可以分为两个类别:抛出异常的方式和返回特定值的方式来指示成功与否;还有另外一对仅尝试执行操作的方法,在失败的情况下它们不会改变队列的状态并立即返回特定位值[^1]。 #### 实现类介绍 ##### LinkedList 作为一个实现了`List`和`Deque`(双端队列)接口的具体类,`LinkedList`同样兼容于`Queue`接口的要求。这意味着它可以被当作普通的双向列表使用的同时也能充当标准的队列角色。由于内部采用了双向链接节点存储数据项的设计方案,使得频繁地在两端添加或者删除元素变得高效。 ```java // 使用LinkedList作为Queue的例子 import java.util.LinkedList; import java.util.Queue; public class Example { public static void main(String[] args){ Queue<String> queue = new LinkedList<>(); queue.offer("First"); queue.offer("Second"); System.out.println(queue.poll()); // 输出 "First" System.out.println(queue.peek()); // 输出 "Second" } } ``` ##### PriorityQueue 不同于传统的FIFO队列,`PriorityQueue`按照自然排序或是由构造时指定的比较器所决定的顺序来排列其元素。当调用`poll()`方法取出下一个待处理的对象时,总是会得到当前具有最高优先级的那个成员。值得注意的是,默认情况下如果未给出显式的比较逻辑,则对象需实现`Comparable`接口以便能够相互之间进行大小关系判断[^4]。 ```java // 使用PriorityQueue的例子 import java.util.PriorityQueue; import java.util.Comparator; class Task implements Comparable<Task>{ private String name; @Override public int compareTo(Task other){ return this.name.compareTo(other.getName()); } // getter and setter... } public class PriorityExample{ public static void main(String[] args){ PriorityQueue<Task> pq = new PriorityQueue<>(new Comparator<Task>() { @Override public int compare(Task t1, Task t2) { return Integer.compare(t1.getImportance(),t2.getImportance()); } }); pq.add(new Task("Task A", 3)); pq.add(new Task("Task B", 1)); while (!pq.isEmpty()){ System.out.println(pq.poll().getName()); } } } ``` ##### LinkedBlockingQueue 对于并发编程环境而言,`LinkedBlockingQueue`是一个非常实用的选择。它是基于链表构建而成的一种阻塞型队列形式,具备良好的线程安全性特征,非常适合应用于生产者-消费者问题以及其他涉及多线程协作的工作流之中[^3]。 ```java // 使用LinkedBlockingQueue的例子 import java.util.concurrent.LinkedBlockingQueue; public class BlockingQueueExample { public static void main(String[] args)throws InterruptedException{ LinkedBlockingQueue<Integer> lbq = new LinkedBlockingQueue<>(10); lbq.put(1); // 可能会被阻塞直到有空间可用 System.out.println(lbq.take()); // 可能会被阻塞直到有元素可取 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值