Java集合之Queue

Queue接口:模拟队列这种数据结构。队列是指“先进先出”(FIFO)的容器。

  • offer()、add():将指定元素加入队列尾部
  • peek()、element():取出队列头部的元素,但不删除这个元素
  • poll()、remove():取出队列头部的元素,同时删除这个元素
一、PriorityQueue类:是Queue的一个比较标准的实现类。
1、储存元素的规则:并不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序(类似于TreeSet)

此时采用peek()或poll()方法取出队列元素时,并不是取出最先进入队列的元素,而是队列中最小的元素。已经违反了FIFO规则。

public class QueueTest {
	public static void main(String[] args) {
		PriorityQueue pq=new PriorityQueue();
		pq.offer(7);
		pq.offer(-3);
		pq.offer(10);
		pq.offer(9);
		System.out.println(pq);   //输出:[-3, 7, 10, 9]
		System.out.println(pq.poll());  //输出:-3
		System.out.println(pq.poll());  //输出:7
		System.out.println(pq.poll());  //输出:9
		System.out.println(pq.poll());  //输出:10
	}
}

当直接输出队列时,可以看到队列里的元素并没有按照大小排序,但这只是因为受到PriorityQueue的toString()方法的影响,是一个假象,当多次调用poll()方法获取对列头部的元素时,可以看到元素是按从小到大被“移出队列”的。

2、PriorityQueue不允许插入null元素,并且需要对元素进行排序,有2种排序方式:自然排序与定制排序。(与TreeSet的2种排序方法一模一样,可以参考前面的Set集合的知识)。

二、Deque接口:Queue的子接口,代表一个“双端队列”,“双端队列”允许从两端来操作队列的元素。

  • addFirst()、offerFirst():将指定元素插入队列的开头
  • addLast()、offerLast():将指定元素插入队列的结末尾
  • peekFirst()、getFirst():获取双端队列的第一个元素,但不删除
  • peekLast()、getLast():获取双端队列的最后一个元素,但不删除
  • pollFirst()、removeFirst():获取双端队列的第一个元素,同时删除该元素
  • pollLast()、removeLast():获取双端队列最后一个元素,同时删除该元素
  • pop():pop出该双端队列所表示的栈的栈顶元素,相当于removeFirst()
  • push():将一个元素push进该双端队列所表示的栈的栈顶,相当于addFirst()
1、Deque接口不仅可以当成双端队列来使用,还可以当成栈来使用

Queue与Deque方法对照表:

Queue方法Deque方法
add()/offer()addLast()/offerLast()
remove()/poll()removeFirst()/pollFirst()
element()/peek()getFirst()/peekFirst()

Stack与Deque方法对照表:

Stack的方法Deque的方法
push()addFirst()/offerFirst()/push()
pop()removeFirst()/pollFirst()/pop()
peek()getFirst()/peekFirst()
2、Deque底层的数组长度默认为16位,前面的ArrayList与Vector默认是10位

三、ArrayDeque类:Deque接口的典型实现类,是一个基于数组实现的双端队列。

1、储存方式:数组
2、ArrayDeque与ArrayList类似,其内部都是一个动态的、可重新分配的Object[]数组

当成栈来使用:先进后出

import java.util.ArrayDeque;
public class QueueTest {
	public static void main(String[] args) {
		//将ArrayDeque当成栈来使用
		ArrayDeque stack=new ArrayDeque();
		stack.push("hello");
		stack.push("world");
		stack.push("china");
		System.out.println(stack);  //输出:[china, world, hello]
		System.out.println(stack.peek()); //访问栈中的第一个元素,但并不删除它
		System.out.println(stack);  //输出:[china, world, hello]
		System.out.println(stack.pop());  //pop出第一个元素
		System.out.println(stack);  //输出:[world, hello]
	}
}
//输出栈的元素就相当于是一种出栈操作

在这里插入图片描述
当成队列来使用:先进先出

import java.util.ArrayDeque;
public class QueueTest {
	public static void main(String[] args) {
		//将ArrayDeque当成队列来使用
		ArrayDeque queue=new ArrayDeque();
		queue.offer("hello");
		queue.offer("world");
		queue.offer("china");
		System.out.println(queue);   //输出:[hello, world, china]
		//访问队列中的第一个元素,但并不删除它
		System.out.println(queue.peek());  //输出:hello
		System.out.println(queue);   //输出:[hello, world, china]
		//poll出第一个元素
		System.out.println(queue.poll());    //输出:hello
		System.out.println(queue);    //输出:[world, china]
	}
}

在这里插入图片描述

四、LinkedList类:该类实现了List接口,因此其能够根据索引来访问集合中的元素。该类又实现了Deque接口,因此可以当成双端队列和栈来使用,

该类的使用方式详细见《Java集合之List》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值