Java集合 之 队列Queue集合

什么是Queue集合?

答:Queue用于模拟队列这种数据结构。队列通常是指“先进先出(FIFO)”的容器。队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素。新元素插入到队列的尾部,取出元素会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。

Queue接口中定义了如下的几个方法:

void add(Object e):  将指定元素插入到队列的尾部。

object element():  获取队列头部的元素,但是不删除该元素。

boolean offer(Object e):  将指定的元素插入此队列的尾部。当使用容量有限的队列时,此方法通常比add(Object e)有效。 

Object peek():  返回队列头部的元素,但是不删除该元素。如果队列为空,则返回null。

Object poll():  返回队列头部的元素,并删除该元素。如果队列为空,则返回null。

Object remove():  获取队列头部的元素,并删除该元素。

Queue接口有一个PriorityQueue实现类。除此之外,Queue还有一个Deque接口,Deque代表一个“双端队列”,双端队列可以同时从两端删除或添加元素,因此Deque可以当作栈来使用。java为Deque提供了ArrayDeque实现类和LinkedList实现类。

1.PriorityQueue实现类

PriorityQueue是一种比较标准的队列实现类,而不是绝对标准的。这是因为PriorityQueue保存队列元素的顺序不是按照元素添加的顺序来保存的,而是在添加元素的时候对元素的大小排序后再保存的。因此在PriorityQueue中使用peek()或pool()取出队列中头部的元素,取出的不是最先添加的元素,而是最小的元素。

public class PriorityQueueTest {
    public static void main(String[] args){
        PriorityQueue pq = new PriorityQueue();
        pq.offer(6);
        pq.add(-3);
        pq.add(20);
        pq.offer(18);
        //输出:[-3, 6, 20, 18]
        System.out.println(pq);
    }
}

PriorityQueue不允许插入null元素,它还需要对队列元素进行排序,PriorityQueue有两种排序方式:

自然排序:采用自然排序的PriorityQueue集合中的元素必须实现Comparator接口,而且应该是一个类的多个实例,否则可能导致ClassCastException异常。

定制排序:创建PriorityQueue队列时,传入一个Comparable对象,该对象负责对所有队列中的所有元素进行排序。采用定制排序不要求必须实现Comparator接口。

2.Dueue接口与ArrayDeque实现类

Deque接口是Queue接口的子接口,它代表一个双端队列,Deque定义了一些方法:

void addFirst(Object e):   将指定元素添加到双端队列的头部。

void addLast(Object e):  将指定元素添加到双端队列的尾部。

Iteratord descendingItrator():  返回该双端队列对应的迭代器,该迭代器以逆向顺序来迭代队列中的元素。

Object getFirst():  获取但不删除双端队列的第一个元素。

Object getLast():  获取但不删除双端队列的最后一个元素。

boolean offFirst(Object e):  将指定元素添加到双端队列的头部。

boolean offLast(OBject e):  将指定元素添加到双端队列的尾部。

Object peekFirst():  获取但不删除双端队列的第一个元素;如果双端队列为空,则返回null。

Object PeekLast():  获取但不删除双端队列的最后一个元素;如果双端队列为空,则返回null。

Object pollFirst():  获取并删除双端队列的第一个元素;如果双端队列为空,则返回null。

Object pollLast():  获取并删除双端队列的最后一个元素;如果双端队列为空,则返回null。

Object pop()(栈方法):  pop出该双端队列所表示的栈的栈顶元素。相当于removeFirst()。

void push(Object e)(栈方法):  将一个元素push进该双端队列所表示的栈的栈顶。相当于addFirst()。

Object removeFirst():  获取并删除该双端队列的第一个元素。

Object removeFirstOccurence(Object o):  删除该双端队列的第一次出现的元素o。

Object removeLast():  获取并删除该双端队列的最后一个元素o。

Object removeLastOccurence(Object o):  删除该双端队列的最后一次出现的元素o。

public class ArrayDequeTest {
    public static void main(String[] args){
        ArrayDeque queue = new ArrayDeque();
        queue.offer("春");
        queue.offer("夏");
        queue.offer("秋");
        //输出:[春, 夏, 秋]
        System.out.println(queue);
        //输出:春
        System.out.println(queue.peek());
        //输出:[春, 夏, 秋]
        System.out.println(queue);
        //输出:春
        System.out.println(queue.poll());
        //输出:[夏, 秋]
        System.out.println(queue);

    }
}

//将双端队列当做栈
public class DequeStack {
    public static void main(String[] args){
        ArrayDeque stack = new ArrayDeque();
        stack.push("春");
        stack.push("夏");
        stack.push("秋");
        //输出:[秋, 夏, 春]
        System.out.println(stack);
        //输出:秋
        System.out.println(stack.peek());
        //输出:[秋, 夏, 春]
        System.out.println(stack);
        //输出:秋
        System.out.println(stack.pop());
        //输出:[夏, 春]
        System.out.println(stack);
    }
}

3.LinkedList实现类

LinkedList是List接口的实现类,因此它可以是一个集合,可以根据索引来随机访问集合中的元素。此外,它还是Duque接口的实现类,因此也可以作为一个双端队列,或者栈来使用。

LinkedList与ArrayList,ArrayDeque的实现机制完全不同,ArrayList和ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而LinkedList以链表的形式来保存集合中的元素,因此随机访问集合元素时性能较差,但是插入和删除元素时性能比较出色(只需改变指针所指的地址即可),需要指出的是,虽然Vector也是以数组的形式来存储集合但因为它实现了线程同步(而且实现的机制不好),故各方面的性能都比较差。

时间: 2024-10-27 07:34:18

Java集合 之 队列Queue集合的相关文章

java中的队列Queue

一.概述 其位于java.util包下,声明:public interface Queue<E> extends Collection<E> 在处理元素前用于保存元素的 collection.除了基本的 Collection 操作外,队列还提供其他的插入.提取和检查操作.每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作).插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的:在大多数实现中,插入操作不

Java——(六)Collection之Queue集合

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Queue集合 Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容器.队列 的头部保存在队列中存放时间最长的元素,队列的尾部保存咋队列中存放时间最短的元素.新元 素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素.通常队列不允许 随机访问队列中的元素. Queue接口中定义了如下几个方法: 1)void add(Object o):将指

【java提高】---queue集合

queue集合 什么是Queue集合? 答:Queue用于模拟队列这种数据结构.队列通常是指“先进先出(FIFO)”的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素. 新元素插入到队列的尾部,取出元素会返回队列头部的元素.通常,队列不允许随机访问队列中的元素. 一.认识queue 1.Queue 方法介绍 从上面来看,Queue(队列)接口继承自Collection,用来表示内部元素具有先后顺序的集合.除了基本的集合操作外,队列还提供了其他插入.删除和检查操作.Que

Java集合 之 Queue集合

什么是Queue集合? 答:Queue用于模拟队列这种数据结构.队列通常是指“先进先出(FIFO)”的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素.新元素插入到队列的尾部,取出元素会返回队列头部的元素.通常,队列不允许随机访问队列中的元素. Queue接口中定义了如下的几个方法: void add(Object e): 将指定元素插入到队列的尾部. object element(): 获取队列头部的元素,但是不删除该元素. boolean offer(Object

Java多线程 阻塞队列和并发集合

转载:大关的博客 Java多线程 阻塞队列和并发集合 本章主要探讨在多线程程序中与集合相关的内容.在多线程程序中,如果使用普通集合往往会造成数据错误,甚至造成程序崩溃.Java为多线程专门提供了特有的线程安全的集合类,通过下面的学习,您需要掌握这些集合的特点是什么,底层实现如何.在何时使用等问题. 3.1 BlockingQueue接口 java阻塞队列应用于生产者消费者模式.消息传递.并行任务执行和相关并发设计的大多数常见使用上下文. BlockingQueue在Queue接口基础上提供了额外

Java 集合与队列的插入、删除在并发下的性能比较

这两天在写一个java多线程的爬虫,以广度优先爬取网页,设置两个缓存: 一个保存已经访问过的URL:vistedUrls 一个保存没有访问过的URL:unVistedUrls 需要爬取的数据量不大,对URL压缩后,可以把这两个数据结构都放入内存,vistedUrls很显然用HashSet<String>实现,因为已经访问的URL只会添加,不会删除和修改,使用HashSet可以高效判断一个URL是否已经访问. 纠结unVistedUrls该用什么数据结构,如果用队列的话,并发情况下,队列中可能会

【Java 集合与队列的插入、删除在并发下的性能比较】

这两天在写一个java多线程的爬虫,以广度优先爬取网页,设置两个缓存: 一个保存已经访问过的URL:vistedUrls 一个保存没有访问过的URL:unVistedUrls 需要爬取的数据量不大,对URL压缩后,可以把这两个数据结构都放入内存,vistedUrls很显然用HashSet<String>实现,因为已经访问的URL只会添加,不会删除和修改,使用HashSet可以高效判断一个URL是否已经访问. 纠结unVistedUrls该用什么数据结构,如果用队列的话,并发情况下,队列中可能会

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set

Java collection 的一些介绍 集合

collections主要提供一些,排序的算法,随机的,反向的,  collection 是容器的祖先接口 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├Has