java的队列_java队列

转自:http://www.cnblogs.com/mercuryli/p/4636231.html

c3a1b04d08b78de1a5a54fda8db3705a.png

什么是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()取出队列中头部的元素,取出的不是最先添加的元素,而是最小的元素。

48304ba5e6f9fe08f3fa1abda7d326ab.png

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);

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

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。

48304ba5e6f9fe08f3fa1abda7d326ab.png

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);

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

//将双端队列当做栈

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);

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

3.LinkedList实现类

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值