📜  ArrayBlockingQueue 和 ArrayDeque 的区别

📅  最后修改于: 2021-09-15 01:07:46             🧑  作者: Mango

ArrayBlockingQueue是Java中的一个类,它实现了BlockingQueue接口。 ArrayBlockingQueue 类及其迭代器实现了 Collection 和 Iterator 接口的所有可选方法。 ArrayBlockingQueue 是一个由数组支持的有界 BlockingQueue。这里,有界意味着队列的大小是有限且固定的。一旦创建就不能增长或缩小队列的大小。如果试图将一个元素插入到一个完整的队列中,那么它将导致操作阻塞。同样,如果尝试从空队列中获取元素,则操作也会被阻塞。 ArrayBlockingQueue 将 Queue 中的元素内部存储在 FIFO 中(先进先出) 命令。队列头部或前面的元素是该队列中所有元素中最旧的元素。该队列尾部的元素是该队列所有元素的最新元素。新元素总是插入到队列的末尾或末尾,检索操作获取队列头的元素。

ArrayBlockingQueue 实现:

Java
// Java program to demonstrate ArrayBlockingQueue
  
import java.util.concurrent.ArrayBlockingQueue;
  
public class ArrayBlockingQueueDemo {
  
    public static void main(String[] args)
    {
        // define capacity of ArrayBlockingQueue
        int capacity = 15;
  
        // create object of ArrayBlockingQueue
        // using ArrayBlockingQueue constructor
        ArrayBlockingQueue abq
            = new ArrayBlockingQueue(capacity);
  
        // add numbers
        abq.add(1);
        abq.add(2);
        abq.add(3);
  
        // print queue
        System.out.println("ArrayBlockingQueue:" + abq);
    }
}


Java
// Java program to demonstrate ArrayDeque
  
import java.util.*;
  
public class ArrayDequeDemo {
  
    public static void main(String[] args)
    {
  
        // Initializing an deque
        Deque de_que = new ArrayDeque(10);
  
        // add numbers
        de_que.add(10);
        de_que.add(20);
        de_que.add(30);
  
        // print queue
        System.out.println("ArrayDeque:" + de_que);
    }
}


输出
ArrayBlockingQueue:[1, 2, 3]

ArrayDeque是Java中的一个类,它实现了 Queue 和 Deque。它可以从两侧动态重新调整大小。这是一种特殊的数组,它可以增长并允许用户从队列的两侧添加或删除元素。它也被称为数组双端队列数组甲板

ArrayDeque 的几个重要特性如下:

  • ArrayDeque 没有容量限制,它们会根据需要增长以支持使用。
  • 它们不是线程安全的,这意味着在没有外部同步的情况下,ArrayDeque 不支持多线程并发访问。
  • ArrayDeque 中禁止使用空元素。
  • 当用作堆栈时,ArrayDeque 类可能比 Stack 更快。
  • 当用作队列时,ArrayDeque 类可能比 LinkedList 更快。

ArrayDeque 实现:

Java

// Java program to demonstrate ArrayDeque
  
import java.util.*;
  
public class ArrayDequeDemo {
  
    public static void main(String[] args)
    {
  
        // Initializing an deque
        Deque de_que = new ArrayDeque(10);
  
        // add numbers
        de_que.add(10);
        de_que.add(20);
        de_que.add(30);
  
        // print queue
        System.out.println("ArrayDeque:" + de_que);
    }
}
输出
ArrayDeque:[10, 20, 30]

ArrayBlockingQueue 和 ArrayDeque 的区别:

S.NO.                           ArrayBlockingQueue                  ArrayDeque
1.

ArrayBlockingQueue implements the BlockingQueue interface.

ArrayDeque implements the Deque interface.

2.

It is a fixed size array queue. Therefore, we cannot grow and shrink the size of an array once we created.

It is a resizable array queue. Therefore, we can grow and shrink the size of the array.

3.

Able to add or remove the elements from only one side of the queue.

Able to add or remove the elements from both sides of the queue.

4. 

ArrayBlockingQueue is thread-safe.

ArrayDeque is not thread-safe.

5.

ArrayBlockingQueue class is not faster than the ArrayDeque class.

ArrayDeque class is faster than the ArrayBlockingQueue class.