【Java源码】集合类-队列Queue
2024-09-07 01:49:43
一、描述
队列Queue这种数据结构,通常指先进先出(FIFO)这种容器。可以模拟生活中依次排队这种场景。
下面是集合体系继承树:
二、Queue
Queue和List一样都是Collection的子接口。
Queue源码定义:
public interface Queue<E> extends Collection<E> {
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
}
- add(E e)/offer(E e) 将指定元素加入到队列尾部
- remove() 返回队列头部元素并删除,如果队列为空,会抛NoSuchElementException
- poll() 返回队列头部元素并删除,如果队列为空,返回null
- element() 返回队列头部元素不删除,如果队列为空,会抛NoSuchElementException
- peek() 返回队列头部元素不删除,如果队列为空,返回null
Queue的实现有PriorityQueue、ArrayDeque、LinkedList。其中ArrayDeque、LinkedList是实现的其子接口Deque。
三、Deque
从上面的继承图可以清楚的看到,Deque是Queue的子接口,它不仅是队列的数据结构,也是一个双端队列数据结构,同时也是一个栈(stack)的数据结构。
Deque源码定义:
public interface Deque<E> extends Queue<E> {
void addFirst(E e);
void addLast(E e);
boolean offerFirst(E e);
boolean offerLast(E e);
E removeFirst();
E removeLast();
E pollFirst();
E pollLast();
E getFirst();
E getLast();
E peekFirst();
E peekLast();
boolean removeFirstOccurrence(Object o);
boolean removeLastOccurrence(Object o);
// *** Queue methods ***
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
// *** Stack methods ***
void push(E e);
E pop();
// *** Collection methods ***
boolean remove(Object o);
boolean contains(Object o);
public int size();
Iterator<E> iterator();
Iterator<E> descendingIterator();
}
Deque的接口和上面的Queue的操作基本相同。xxxFirst操作队列头部元素,xxxLast操作队列尾部元素。
另外Deque可以表示一个栈(stack):具有后进先出(LIFO)的特征。
- push(E e) 入栈
- pop() 出栈,如果栈为空时出栈会抛出NoSuchElementException异常,所以在出栈之前先peek()查看头部元素,如果栈为空会返回null.
Stack类
Java中还有一个Stack类,这个类继承Vector。
public class Stack<E> extends Vector<E> {
从源码中可以看到Stack的pop()和peek()方法都是被synchronized修饰的。因此Stack的栈是线程安全的,但也因此降低了栈的性能。所以当我们不需要线程安全的场景时,应该用Deque.
public synchronized E peek()
public synchronized E pop()
最新文章
- 服务器支持AspJpeg和JMail45_free.msi组件
- Mac下JDK安装配置
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
- oracle对象类型
- C#客户端链接网页需要用到的WebClient
- Entity SQL 初入
- regular expression 基本语法
- python特性、属性以及私有化
- Qt将窗体变为顶层窗体(activateWindow(); 和 raise() )
- Java Object 对象拷贝
- ubuntu 16.04 安装 vscode
- python的dir()和__dict__属性的区别
- Scrapy (网络爬虫框架)入门
- python_05 可变类型与不可变类型、集合、字符串格式化
- git 提交命令
- 使用__FILE__和__LINE__定位错误
- PS切图导出代码后出现的图片布局散乱的解决方法——table布局
- java ssm 后台框架平台 项目源码 websocket即时聊天发图片文字 好友群组 SSM源码
- 洛谷 P1306 斐波那契公约数
- jQuery动画中stop()与 finish()区别
热门文章
- NSString 与NSMutableString的区别
- Java编译时根据调用该方法的类或对象所属的类决定
- 原生js的容易忽略的相似点(二)
- 洛谷 P2788 数学1(math1)- 加减算式
- 导入Excel表格(二)
- zk伪集群部署
- JavaSE-31 Java正则表达式
- OERR: ORA-1410 "invalid ROWID" Master Note / Troubleshooting, Diagnostic and Solution (文档ID 1410.1)
- /etc/rc.d启动目录详解
- Python运维工程师