zoukankan      html  css  js  c++  java
  • Java集合中的ArrayDeque

    ArrayDeque介绍

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

    常用的方法

    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() 克隆(复制)一个新的队列
    

    注意点

    • 结构:在 ArrayDeque 底层使用了数组来存储数据,同时用两个 int head tail 来表示头部和尾部。不过需要注意的是 tail 并不是尾部元素的索引,而是尾部元素的下一位,即下一个将要被加入的元素的索引。
    • 数组长度大小计算: 得到下一个 输入长度的2的幂次方的值。
    private void allocateElements(int numElements) {  
        int initialCapacity = MIN_INITIAL_CAPACITY;  
        // 找到大于需要长度的最小的2的幂整数。  
        // 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];  
    }  
    
    • 扩容:大小变为原来的两倍。

    使用

        // 作为堆栈使用
        ArrayDeque<String> stack = new ArrayDeque<>();
        stack.push("hello");
        stack.push(" ");
        stack.push("world!");
        System.out.println(stack.pop());
        System.out.println(stack.size());
        System.out.println(stack.getFirst());
    
        // 作为队列使用
        ArrayDeque<String> queue = new ArrayDeque<>();
        queue.offer("hello");
        queue.offerLast("world");
        System.out.println(queue.poll());
        System.out.println(queue.size());
    

    LinkedList 的集合使用起来差不多,但是性能应该会好一些。

  • 相关阅读:
    webbrowser获取页面文章指定段落内容
    webbrowser防止弹窗(IE)
    webbrowser模拟手动输入
    WPF加载Winform窗体时 报错:子控件不能为顶级窗体
    FAQs: 我们可以在那里来为我的没有提升管理权限的应用程序存储用户数据?
    Winform中修改WebBrowser控件User-Agent的方法(已经测试成功)
    必应代码搜索 Bing Code Search 安装
    Microsoft Visual Studio Professional 2012 专业版 下载
    vs2012 aspx 没有设计视图了?
    vs2010 Express 下载连接
  • 原文地址:https://www.cnblogs.com/hnxbp/p/15083547.html
Copyright © 2011-2022 走看看