Java集合(四三): ArrayDeque

目录

写在前面

1、常用方法

2、使用说明

方法

3、源码分析

3.1、属性

3.2、构造方法 


写在前面

  • ArrayDeque是 Deque接口的一个实现,使用了可变数组,所以没有容量上的限制。同时, ArrayDeque是线程不安全的,在没有外部同步的情况下,不能再多线程环境下使用。
  • ArrayDeque是 Deque的实现类,可以作为栈来使用,效率高于 Stack;也可以作为队列来使用,效率高于 LinkedList。
  • ArrayDeque 是 Java 集合中双端队列数组实现,双端队列的链表实现(LinkedList
  • 需要注意的是, ArrayDeque不支持 null值。

1、常用方法

 1.添加元素
        addFirst(E e)在数组前面添加元素
        addLast(E e)在数组后面添加元素
        offerFirst(E e) 在数组前面添加元素,并返回是否添加成功
        offerLast(E e) 在数组后天添加元素,并返回是否添加成功

  2.删除元素
        removeFirst()删除第一个元素,并返回删除元素的值,如果元素为null,将抛出异常
        pollFirst()删除第一个元素,并返回删除元素的值,如果元素为null,将返回null
        removeLast()删除最后一个元素,并返回删除元素的值,如果为null,将抛出异常
        pollLast()删除最后一个元素,并返回删除元素的值,如果为null,将返回null
        removeFirstOccurrence(Object o) 删除第一次出现的指定元素
        removeLastOccurrence(Object o) 删除最后一次出现的指定元素
   

   3.获取元素
        getFirst() 获取第一个元素,如果没有将抛出异常
        getLast() 获取最后一个元素,如果没有将抛出异常
   

    4.队列操作
        add(E e) 在队列尾部添加一个元素
        offer(E e) 在队列尾部添加一个元素,并返回是否成功
        remove() 删除队列中第一个元素,并返回该元素的值,如果元素为null,将抛出异常(其实底层调用的是removeFirst())
        poll()  删除队列中第一个元素,并返回该元素的值,如果元素为null,将返回null(其实调用的是pollFirst())
        element() 获取第一个元素,如果没有将抛出异常
        peek() 获取第一个元素,如果返回null
      

    5.栈操作
        push(E e) 栈顶添加一个元素
        pop(E e) 移除栈顶元素,如果栈顶没有元素将抛出异常
        

    6.其他
        size() 获取队列中元素个数
        isEmpty() 判断队列是否为空
        iterator() 迭代器,从前向后迭代
        descendingIterator() 迭代器,从后向前迭代
        contain(Object o) 判断队列中是否存在该元素
        toArray() 转成数组
        clear() 清空队列
        clone() 克隆(复制)一个新的队列

2、使用说明

  • ArrayDeque 是 Java 集合中双端队列数组实现,双端队列的链表实现(LinkedList)。
  • ArrayDeque 几乎没有容量限制,设计为线程不安全的禁止 null 元素
  • ArrayDeque 作为使用时比 Stack 类效率要高,作为队列使用时比 LinkedList 要快
  • ArrayDeque 大多数的额操作都在固定时间内运行,例外情况包括 removeremoveFirstOccurrenceremoveLastOccurrencecontainsiterator.remove(),和批量操作,这些将以线性时间运行。
  • iterator同样也被设计为 fail-fast。

方法

ArrayDeque 作为 队列(FIFO) 使用时的方法

队列方法等效的双端队列方法
add(e)

addLast(e)

remove()removeFirst()
offer(e)offerLast(e)
poll()pollFirst()
element()getFirst()
peek()peekFirst()

ArrayDeque 作为 堆栈(FILO) 使用时的方法:

堆栈方法等效的双端队列方法
push(e)addFirst(e)
pop(e)removeFirst(e)
peek()peekFirst()

3、源码分析

3.1、属性

        在ArrayDeque底层使用了数组来存储数据,同时用两个intheadtail来表示头部和尾部。不过需要注意的是tail并不是尾部元素的索引,而是尾部元素的下一位,即下一个将要被加入的元素的索引。

//用数组存储元素
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;

3.2、构造方法 

ArrayDeque有三个构造函数来初始化,除了无参的构造函数使用了默认容量,其它两个构造函数会通过allocateElements来计算初始容量。

public ArrayDeque() {  
    elements = (E[]) new Object[16]; // 默认的数组长度大小  
}  
  
public ArrayDeque(int numElements) {  
    allocateElements(numElements); // 需要的数组长度大小  
}  
  
public ArrayDeque(Collection<? extends E> c) {  
    allocateElements(c.size()); // 根据集合来分配数组大小  
    addAll(c); // 把集合中元素放到数组中  
}  

  • 34
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值