Android知识Android技术知识程序员

源码的魅力 - ArrayDeque 的工作原理

2017-09-14  本文已影响0人  Nichool

ArrayDeque 的工作原理(Android 7.1源码)

简介

ArrayDeque 是以循环数组形式实现的双向队列

运行原理

  1. ArrayDeque内部是使用的数组实现,并通过head以及tail两个索引来进行操作。
    ...
    transient Object[] elements;
    // non-private to simplify nested class access
    ...
    transient int head;
    ...
    transient int tail;
    ...
    public ArrayDeque() {
        //默认2的倍数
        elements = new Object[16];
    }
    //另一个指定大小的构造函数也是将elements的大小设置成2的倍数
    //由于函数太长就不再解释.
  1. offer函数的分析
  ...
  public boolean offer(E e) {
      return offerLast(e);
  }

  ...
  public boolean offerLast(E e) {
      addLast(e);
      return true
  }

  ...
  public void addLast(E e) {
     if (e == null)
         throw new NullPointerException();
     elements[tail] = e;
     if ( (tail = (tail + 1) & (elements.length - 1)) == head)
         doubleCapacity();
 }
  1. addFirst函数分析

  public void addFirst(E e) {
      if (e == null)
          throw new NullPointerException();
      elements[head = (head - 1) & (elements.length - 1)] = e;
      if (head == tail)
          doubleCapacity();
  }

与上面的addLast的同理,只不过head是减1,tail是加1。

  1. pollFirst与pollLast函数分析
//从队列的顶部获取数据
public E pollFirst() {
     final Object[] elements = this.elements;
     final int h = head;
     @SuppressWarnings("unchecked")
     E result = (E) elements[h];
     // Element is null if deque empty
     if (result != null) {
         elements[h] = null; // Must null out slot
         head = (h + 1) & (elements.length - 1);
     }
     return result;
 }
  //从队列底部获取数组
  public E pollLast() {
      final Object[] elements = this.elements;
      final int t = (tail - 1) & (elements.length - 1);
      @SuppressWarnings("unchecked")
      E result = (E) elements[t];
      if (result != null) {
          elements[t] = null;
          tail = t;
      }
      return result;
  }

其实原理依旧和offer相似只是获取数据而已,pollFirst直接把head的数据返回并置为空(GC可以清理),然后将head下移。pollLast由于当前的tail是指向的尾部的下一位,所以尾部的数据是tail的上一位,返回上一位数据并置空,然后将tail上移。

上一篇 下一篇

猜你喜欢

热点阅读