Java容器之ArrayDeque源码分析(你知道ArrayDeque维护循环数组的原理吗?)

  在上一篇博客 Java容器之LinkedList源码分析(LinkedList到底是单链表还是双链表?) 分析了LinkedList容器的源码,LinkedList实现了Deque接口,所以它不但是一个List容器,而且还是一个双端队列容器,并且是基于双链表实现。在此篇博客,将分析基于(循环)数组实现的双端队列容器——ArrayDeque

注明:以下源码分析都是基于jdk 1.8.0_221版本
在这里插入图片描述

一、ArrayDeque容器概述

  ArrayDeque类的声明如下:

public class ArrayDeque<E> extends AbstractCollection<E>
                           implements Deque<E>, Cloneable, Serializable

在这里插入图片描述
  Java中的ArrayDeque容器实现了Deque接口,所以它是一个双端队列队头队尾都可以进行出队入队)容器,并且是底层是通过(循环)数组来存放数据。Java中的LinkedList容器也实现了Deque接口,不过底层是通过维护链表保存数据。
在这里插入图片描述

二、ArrayDeque类的主要属性

/**
 * 循环数组
 */
transient Object[] elements; // non-private to simplify nested class access

/**
 * 队头对应的下标
 */
transient int head;

/**
 * 队尾对应的下标
 */
transient int tail;
/**
 * 数组最短的长度(数组的长度需要保持为2的幂,主要是将求余操作转换为移位操作)
 */
private static final int MIN_INITIAL_CAPACITY = 8;

三、ArrayDeque类的构造器

/**
 * 数组默认初始化长度为16
 */
public ArrayDeque() {
   
    elements = new Object[16];
}

/**
 * 指定数组的长度
 */
public ArrayDeque(int numElements) {
   
	// 不过数组的长度需要保持为2的次幂,调用allocateElements方法初始化(后面有介绍这个方法)
    allocateElements(numElements);
}

/**
 * 复制构造方法
 */
public ArrayDeque(Collection<? extends E> c) {
   
	// 先初始化数组,最小长度为c.size(不过仍然需要转换为不必它小的最小2的次幂)
    allocateElements(c.size())
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值