ArrayDeque
一、类图关系
二、要点分析
1. ArrayDeque 不允许空元素 null
2. 当用作栈时,比 Stack 快,当用作队列时,比 LinkedList 快
一是因为它基于循环数组(只需操作索引),二是没有使用 Synchronized 修饰方法(非线程安全)
This class is likely to be faster than
Stack
when used as a stack, and faster thanLinkedList
when used as a queue.
3. 迭代器 fail-fast
4. 容量是 2 的整数次幂,最小(初始)容量是 8,构造函数可以指定容量,自动修正为 2 的整数次幂大小
默认容量是16
private void allocateElements(int numElements) {
int initialCapacity = MIN_INITIAL_CAPACITY;
// Find the best power of two to hold elements.
// Tests "<=" because arrays aren't kept full.
if (numElements >= initialCapacity) {
initialCapacity = numElements;
initialCapacity |= (initialCapacity >>> 1);
initialCapacity |= (initialCapacity >>> 2);
initialCapacity |= (initialCapacity >>> 4);
initialCapacity |= (initialCapacity >>> 8);
initialCapacity |= (initialCapacity >>> 16);
initialCapacity++;if (initialCapacity < 0) // Too many elements, must back off
initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
}
elements = new Object[initialCapacity];
}// 解释说明
简单分析一下代码的运算过程,注:">>>"代表按位右移 (空位 0 补齐):
假设a=1xxxxxxxxxxxx...(base 2, x代表该位任意为0或1)
首先a |= (a >>> 1)之后,a => 11xxxxxxxx...(最高两位是1)
然后a |= (a>>> 2): a => 1111xxxxxxxxx...(最高四位是1)
再a |= (a>>> 4): a => 11111111xxxxxxx...(最高八位是1)
........
最终,a的所有低位也都变成了1,即11111111...111(全是1)
再a++ 就变成了10000000000...000(加一之后进位,比原来的二进制串多了一位,且第一位是1,其它位都是0),这个算法不仅时间效率高,而且只用到了一个变量,真可谓是短小精悍,在HashMap里也可以看到这个算法的身影。
5. 容量占满时,使用翻倍策略扩容,内部是个数组(循环数组)
private void doubleCapacity() {
assert head == tail;
int p = head;
int n = elements.length;
int r = n - p; // number of elements to the right of p
int newCapacity = n << 1;
if (newCapacity < 0)
throw new IllegalStateException("Sorry, deque too big");
Object[] a = new Object[newCapacity];
System.arraycopy(elements, p, a, 0, r);
System.arraycopy(elements, 0, a, r, p); // 理解这两句,请看下图
elements = a;
head = 0;
tail = n;
}
注意: head 指向实际存有数据的头节点,tail 指向下一个应该放数据的尾节点
6. 取下标操作使用位运算,例如
public E pollFirst() {
int h = head;
@SuppressWarnings("unchecked")
E result = (E) elements[h];
// Element is null if deque empty
if (result == null)
return null;
elements[h] = null; // Must null out slot
head = (h + 1) & (elements.length - 1);
return result;
}
7. 含逆向迭代方法 descendingIterator
ArrayDeque相关推荐
- List 系列 ArrayList LinkedList CopyOnWriteArrayList Queue系列 ArrayDeque ConcurrentLinkedDeque LinkedBlo
LinkedBlockingDeque作为一种阻塞双端队列,提供了队尾删除元素和队首插入元素的阻塞方法.该类在构造时一般需要指定容量,如果不指定,则最大容量为Integer.MAX_VALUE.另外, ...
- 死磕 java集合之ArrayDeque源码分析
问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...
- java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析
栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...
- 033_使用ArrayDeque模拟队列结构
import java.util.ArrayDeque; import java.util.Iterator;/*** 使用ArrayDeque模拟队列结构*/ public class QueueU ...
- 032_使用ArrayDeque模拟栈结构
import java.util.ArrayDeque; import java.util.Iterator;/*** 使用ArrayDeque模拟栈结构*/ public class DequeSt ...
- ArrayDeque中的取余
Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字).而当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque:既然Queue只是一个接口, ...
- Java ArrayDeque
介绍: Java中的ArrayDeque是实现Deque接口的类. 它是双端队列的基于数组的实现. 顾名思义,双端队列是允许我们在前端和后端添加或删除项目的队列. 在开始之前,让我们快速看一下Arra ...
- java 方法 示例_Java ArrayDeque pollFirst()方法与示例
java 方法 示例 ArrayDeque类pollFirst()方法 (ArrayDeque Class pollFirst() method) pollFirst() Method is avai ...
- java 方法 示例_Java ArrayDeque offerFirst()方法与示例
java 方法 示例 ArrayDeque类offerFirst()方法 (ArrayDeque Class offerFirst() method) offerFirst() Method is a ...
- sheets.add示例_Java ArrayDeque add()方法与示例
sheets.add示例 ArrayDeque类add()方法 (ArrayDeque Class add() method) add() Method is available in java.la ...
最新文章
- datatables如何把列设置成hidden隐藏域?
- docker ps 列出容器 命令简介
- js中期BOM及this指向
- 在 Java OOP 编程中的注意事项
- linux if 判断文件数量,linux if判断命令
- springboot + vue 拦截器重定向_springboot学习笔记
- python入门教程(非常详细)-Python入门教程:超详细1小时学会Python
- ORACLE11g R2数据库安装(一)
- 总结:常用的 Python 爬虫技巧
- MongoDB可视化工具Robomongo 和 Mongochef
- 《西游记》中的未解之谜,经典之至
- [转]一淘网是如何实现系统架构的
- 微信每天加多少人不会封号?(行业经验)
- Linux查询系统上次启动时间last reboot、上线时间uptime
- base64加密解密
- 2023最新仿蓝奏云合集下载页面系统源码+有PHP后台版的
- Python爬取网易云音乐热歌排行榜Top200音乐
- aac格式怎么转换为MP3格式
- IP65等IP防尘防水等级测试标准IEC60529测试内容详解
- ftp服务器上文件移动失败(ftpClient.rename返回false)
热门文章
- Rides持久化机制
- [运动规划算法]基于飞行走廊的轨迹优化
- opensslErrorStack: [ ‘error:03000086:digital envelope routines::initialization error‘ ]
- 高速场景下自动驾驶车辆定位方法综述
- 【阅读整理】An Accurate Skeleton ExtractionApproach From 3D Point Clouds of Maize Plants
- thymeleaf取值域名加不加#的区别
- 详解MySQL事务原理
- 钉钉的密聊消息会保存在服务器吗,钉钉密聊怎么保护客户的隐私?
- 品效协同,国货新秀colorkey珂拉琪的户外广告制胜秘籍
- leetcode 86