什么是Queue集合:

Queue用于模拟队列这种数据结构,队列通常是“先进先出”(FIFO)的容器。队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素。 
 

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

  • void add(Object e):将制定的元素加入队列的尾部
  • Object element(): 获取队列的头部元素,但不要删除改元素
  • boolean offer(Object e): 将制定元素加入此队列的尾部。当使用有容量限制的队列的时候,该方法比add方法更好
  • Object peek() : 获取队列头部的元素,但是不删除,如果队列为空,那么返回null
  • Object remove(): 获取队列头部的元素,并删除该元素
  • Object poll(): 获取并删除元素的头部的元素,如果队列为空,返回null

PriorityQueue实现类:

PriorityQueue是一个比较标准的队列实现类。为什么我们说它是比较标准的实现类,而不是绝对标准的呢?因为PriorityQueue队列的存放顺序,不是按照我们添加的顺序存放的,而是按照队列的元素大小重新排序的。所以说,我们调用peek()或者poll()方法区取出我们队列中的元素的时候,并不是取出最先加入的,而是取出最小的值。从这个意义上来看,PriorityQueue违反了队列的先进先出(FIFO)基本规则。

如何排序(同TreeSet):

  • 自然排序:每个队列存放的元素都必须实现Comparable这个接口
  • 定制排序,初始化PriorityQueue的时候,必须传入一个Comapator对象
 示例:

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue; /**
* @ClassName PriorityQueueExample
* @projectName: object1
* @author: Zhangmingda
* @description: PriorityQueue 是Queue接口的实现类,队列内的元素会有优先级之分,并不是先进先出
* date: 2021/4/10.
*/
public class PriorityQueueExample {
public static void main(String[] args) {
Queue queue = new PriorityQueue();
queue.add(3);
queue.add(33);
queue.add(32);
queue.add(-1);
queue.add(-9);
System.out.println(queue); //[-9, -1, 32, 33, 3]
Queue queue1 = new PriorityQueue((o, t1) -> (int) t1 - (int)o);
queue1.add(3);
queue1.add(33);
queue1.add(32);
queue1.add(-1);
queue1.add(-9);
System.out.println(queue1); //[33, 3, 32, -1, -9]
}
}

对象定制排序

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue; /**
* @ClassName PriorityQueueExample
* @projectName: object1
* @author: Zhangmingda
* @description: PriorityQueue 是Queue接口的实现类,队列内的元素会有优先级之分,并不是先进先出
* date: 2021/4/10.
*/
public class PriorityQueueExample {
public static void main(String[] args) {
class User implements Comparable{
int age; public User(int age) {
this.age = age;
} @Override
public int compareTo(Object o) { return this.age - ((User)o).age;
} @Override
public String toString() {
return "User{" +
"age=" + age +
'}';
}
} Queue queue2 = new PriorityQueue();
queue2.offer(new User(32));
queue2.offer(new User(12));
queue2.offer(new User(48));
queue2.offer(new User(8));
System.out.println(queue2); //[User{age=8}, User{age=12}, User{age=48}, User{age=32}]
}
}

Deque接口和ArrayDeque实现类:

Deque接口是Queue接口的子接口,它代表一个双端队列:
特点:
  • 添加元素可以选择从前或后都可
0
Deque接口里定义了一些双端队列的方法:
  • void addFirst(Object o):将指定的元素插入到双端队列的开头
  • void addLast(Object o):将指定的元素插入该双端队列的末尾
  • boolan offerFirst(Object e): 将指定元素插入该双端队列的开头
  • boolan offerLast(Object e): 将指定元素插入到双端队列的末尾
  • Iterator descendingIterator():返回该双端队列对应的迭代器,该迭代器将以逆向顺序来迭代代码中的元素。
  • Object getFirst(): 获取但不删除双端队列的第一个元素
  • Object getLast(): 获取但不删除双端对垒的最后一个元素
  • Object peekFirst(): 获取但不删除该双端队列的第一个元素,如果此双端队列为空,那么返回null
  • Object peekLast(): 获取但不删除该双端队列的最后一个元素,如果此双端队列为空,那么返回null
  • Object pollFirst(): 获取并删除该双端队列的第一个元素,如果双端队列为空,那么返回null
  • Object pollLast():获取并删除该双端队列的最后一个元素,如果此双端队列为空,那么返回null
不仅可以当成双端队列使用,而且还可以被当做栈来使用,因为该类里面还包含了pop(出栈)、push(入栈)两个方法。

栈方式增删(先进后出):

  • void push(Object e): 将一个元素push进该双端队列所表示的栈的栈顶。相当于addFirst()
  • Object pop() 栈方法 : pop出双端队列所表示的栈的栈顶的元素。相当于removeFirst();
从上面方法中可以看出,Deque
什么是栈:
0
 
栈方式的使用方法:先进后出

import java.util.ArrayDeque;
import java.util.Queue; /**
* @ClassName ArrayQueueExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/10.
*/
public class ArrayQueueExample {
public static void main(String[] args) {
ArrayDeque stack = new ArrayDeque();
stack.push("张三");
stack.push("李四");
stack.push("老刘");
System.out.println(stack);
System.out.println(stack.size());
int count = stack.size(); //注意:为什么不直接放到for循环里面?size()是变化的:因为for循环过程中pop后size()的值就变小了
for(int i=0; i<count; i++){
String s = (String)stack.pop();
System.out.println(s);
}
/**
* 老刘
* 李四
* 张三
*/
}
}
ArrayQueue队列的使用方法:先进先出
 
import java.util.ArrayDeque;
import java.util.Queue; /**
* @ClassName ArrayQueueExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/10.
*/
public class ArrayQueueExample {
public static void main(String[] args) {
Queue queue = new ArrayDeque();
queue.offer("张三");
queue.offer("老李");
queue.offer("老王");
int counts = queue.size();
for(int i=0; i<counts; i++){
String s = (String)queue.poll();
System.out.println(s);
}
/** 队列先进先出,后进后出
* 张三
* 老李
* 老王
*/
}
}

descendingIterator(): ArrayDeque特有逆向迭代器,逆向取对象

        ArrayDeque queue2 = new ArrayDeque();
queue2.offer("张三");
queue2.offer("老李");
queue2.offer("老王");
Iterator iterator = queue2.descendingIterator(); //ArrayDeque特有逆向迭代器
while (iterator.hasNext()){
System.out.println(iterator.next());
}
/** ArrayDeque特有逆向迭代器,逆向取对象
* 老王
* 老李
* 张三
*/

LinkedList:

特点:
  • LinkedList是同时实现List接口和Deque接口的实现类,因此LinkedList可以被当做栈和队列来使用。
  • 底层数据结构是双向链表,访问慢、添加删除效率高
 代码如上只不过实现类不一样。
 
 
 
 
 
 

java 数据类型:集合接口Collection之队列Queue:PriorityQueue ;Dequeue接口和ArrayDeque实现类:的更多相关文章

  1. Java:集合,Collection接口框架图

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  2. Java自学-集合框架 Collection

    Java集合框架 Collection Collection是一个接口 步骤 1 : Collection Collection是 Set List Queue和 Deque的接口 Queue: 先进 ...

  3. [Java复习] 集合框架 Collection

    Q1 Collection java的集合以及集合之间的继承关系? 数组和链表的区别? 固定长度,连续内存,不能扩展,随机访问快,插入删除慢.链表相反 List, Set, Map的区别? List, ...

  4. java学习——集合框架(Collection,List,Set)

    集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定,就使用集合容器进行存储. 集合特点:1,用于存储对象的容器.2,集合的长度是可变的.3,集合中不可以存储基本数据类型值. ...

  5. 【Java】集合概述Collection、Map

    Java集合分为Collection和Map,Collection又分为List.Set. List中有ArrayList.LinkedList和Vector:Set中又分为HashSet和TreeS ...

  6. Java多线程总结之线程安全队列Queue

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非 ...

  7. 【java】Java多线程总结之线程安全队列Queue【转载】

    原文地址:https://www.cnblogs.com/java-jun-world2099/articles/10165949.html ============================= ...

  8. Java数据结构与算法(4) - ch04队列(Queue和PriorityQ)

    队列: 先进先出(FIFO). 优先级队列: 在优先级队列中,数据项按照关键字的值有序,关键字最小的数据项总在对头,数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序,从后往前将小于插入项的数 ...

  9. Java精选笔记_集合概述(Collection接口、Collections工具类、Arrays工具类)

    集合概述 集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体.集合被用于存储.获取.操纵和传输聚合的数据. 使用集合的技巧 看到Array就是数组结构,有角标,查询速 ...

随机推荐

  1. PHP数组详细介绍(带示例代码)

    PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合 ...

  2. GPG 使用指南

    加密与签名 在传输信息时,会面临两个典型的问题: 如何保证发出的消息,只能被预期的接收人获取? 如何保证收到的消息,确实由预期的发送人发出? 这两个问题不难理解.例如发送的邮件可能会被监听,诈骗分子可 ...

  3. “微信小程序从分享卡片进入,第一次获取不到用户uid、第二次能获取到用户uid”解决方法

    用uniapp开发微信小程序时,有一个需求是分享罐表详情页面给其它用户,其它用户(在已经登录的状态下)点击分享卡片可以直接跳转到该罐表详情页,且能显示自己是否已经收藏该罐表(收藏状态由用户uid和罐表 ...

  4. 【AGC板刷记录】

    这个帖子,是在自己学知识点累了的时候就看看\(AGC\)的题目来休息. 而且白天上课可以做( AGC-001 \(A\ BBQ Easy\) 考虑从小到大排,相邻两个取为一对. BBQ Easy #i ...

  5. Atcoder Regular Contest 058 D - 文字列大好きいろはちゃん / Iroha Loves Strings(单调栈+Z 函数)

    洛谷题面传送门 & Atcoder 题面传送门 神仙题. mol 一发现场(bushi)独立切掉此题的 ycx %%%%%%% 首先咱们可以想到一个非常 naive 的 DP,\(dp_{i, ...

  6. 区分wsgi、uWSGI、uwsgi、php-fpm、CGI、FastCGI

    在学习Python web开发时候,可能会遇到诸如uwsgi,wsgi等名词,下面通过梳理总结探究它们之间的关系. CGI CGI,(Common Gateway Interface)通用网关接口,是 ...

  7. R语言与医学统计图形-【16】ggplot2几何对象之标签与文本

    ggplot2绘图系统--添加标签与文本.数学表达式.条形图文本.注释 1. 文本与标签添加 geom_label的文本将以标签形式出现,即文本会带有一个背景色. geom_text则是纯文本形式展示 ...

  8. A Child's History of England.43

    PART THE SECOND When the King heard how Thomas à Becket had lost his life in Canterbury Cathedral, t ...

  9. 零基础学习java------day4------流程控制结构

    1. 顺序结构 代码从上往下依次执行 2. 选择结构 也叫分支结构,其会根据执行的结果选择不同的代码执行,有以下两种形式: if  语句 switch  语句 2.1 if 语句 2.1.1  if语 ...

  10. 集合类——Map集合、Properties属性文件操作

    1.Map集合 Collection集合的特点是每次进行单个对象的保存,若要对一对对象来进行保存就只能用Map集合来保存.即Map集合中一次可以保存两个对象,且这两个对象的关系是key = value ...