ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

ArrayDeque类源码解析(1/8)

来源:网络整理     时间:2016-07-16     关键词:

本篇文章主要介绍了" ArrayDeque类源码解析",主要涉及到方面的内容,对于其他编程jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: ArrayDeque 1.数组实现双向队列 2.没有实现同步方法,线程不安全,效率较高 3.比LinkedList效率高 4.实现了栈,队列,作为栈使用...

ArrayDeque
1.数组实现双向队列
2.没有实现同步方法,线程不安全,效率较高
3.比LinkedList效率高
4.实现了栈,队列,作为栈使用时候效率比Stack高,作为队列时候比LinkedList效率高

通过数组实现双端队列,注意实现的还是循环队列

所在包

package java.util;
import java.io.*;

继承AbstractCollection
实现Deque、Cloneable、Serializable

publicclassArrayDeque<E> extendsAbstractCollection<E>
                           implementsDeque<E>, Cloneable, Serializable{// 内部代码下面讲解
}

四个变量

/**
     * 数组作为存储结构
     */privatetransient E[] elements;

    /**
     * 头节点下标
     */privatetransientint head;

    /**
     * 尾节点下标
     */privatetransientint tail;

    /**
     * 创建队列最小容量,容量必须是2的x次方
     */privatestaticfinalint MIN_INITIAL_CAPACITY = 8;

分配空间

/**
     * 分配空间
     *
     * @param numElements  the number of elements to hold
     */privatevoidallocateElements(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 = (E[]) new Object[initialCapacity];
    }

满的时候,进行扩容,这里需要移动元素

/**
     * head == tail 时候表示队列满了,需要扩充
     * Double the capacity of this deque.  Call only when full, i.e.,
     * when head and tail have wrapped around to become equal.
     */privatevoiddoubleCapacity() {
        assert head == tail;
        int p = head;
        int n = elements.length;
        int r = n - p; // 元素个数int newCapacity = n << 1; // 新的空间,左移一位,新增加空间是原始空间的大小if (newCapacity < 0)
            thrownew 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 = (E[])a;
        head = 0;
        tail = n;
    }

队列元素复制到数组

相关图片

相关文章