The use of commonly used queues in Java
In Java programming, queues are a very important data structure and are widely used in scenarios such as task scheduling, messaging, and multi-threaded communication.
The following will introduce several commonly used Java queues and their usage methods in detail.
1. Queue interface overview
Queue
It is an interface in the Java collection framework that defines the first-in-first-out (FIFO) data structure behavior. Common implementation classes include:
-
LinkedList
: Implements a double-ended queue (Deque), which supports insertion and removal operations on both ends. -
ArrayDeque
: An efficient queue implementation based on arrays, and also supports dual-ended operations. -
PriorityQueue
: A queue sorted by element priorities.
2. Common queue implementation classes and usage
(1) LinkedList as Queue
AlthoughLinkedList
Mainly used for list structure, but it also implementsQueue
Interfaces can be used as queues.
Main methods:
-
add(E element)
: Insert the specified element into the tail of the queue. -
remove()
: Removes and returns the header element. If the queue is empty, throwNoSuchElementException
。 -
peek()
: Check the team head elements and do not remove them. If the queue is empty, returnnull
。
Sample code:
Queue<String> queue = new LinkedList<>(); ("A"); ("B"); (()); // Output A String element = (); (element); // Output A
(2) ArrayDeque
ArrayDeque
It is an array-based double-ended queue that supports quick insertion and removal of elements on both ends. It implementsQueue
andDeque
interface.
Main methods:
-
addFirst(E element)
: Adds the specified element to the queue header. -
addLast(E element)
: Adds the specified element to the end of the queue. -
removeFirst()
: Removes and returns the element at the head of the queue. -
removeLast()
: Removes and returns the element at the end of the queue.
Sample code:
Queue<String> deque = new ArrayDeque<>(); ("A"); ("B"); (()); // Output A ("C"); // Add to header(()); // Output C String element = (); // Remove the head element C(element); // Output C
(3) PriorityQueue
PriorityQueue
is a priority queue in which elements are sorted according to their natural order or specified comparator. The highest priority element is always returned every time it is removed.
Main methods:
-
add(E element)
: Insert the specified element into the queue. -
remove()
: Removes and returns the header element (i.e. the element with the highest priority). -
peek()
: Check the team head elements and do not remove them.
Sample code:
Queue<Integer> priorityQueue = new PriorityQueue<>(); (3); (1); (2); (()); // Output 1 int element = (); (element); // Output 1
(4) BlockingQueue
BlockingQueue
It is an interface in Java concurrency package, mainly used in the producer-consumer mode in a multi-threaded environment. Common implementation classes include:
-
LinkedBlockingQueue
: Bounded or unbounded queues based on linked lists. -
ArrayBlockingQueue
: Bounded queue based on array. -
PriorityBlockingQueue
: Supports priority bounded queues.
Sample code (using LinkedBlockingQueue):
import ; public class BlockingQueueExample { public static void main(String[] args) throws InterruptedException { BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<>(2); // Producer thread Thread producerThread = new Thread(() -> { try { ("Producers start production..."); ("Item 1"); ("Item 2"); ("Item 3"); // The queue is full, blocking until there is space } catch (InterruptedException e) { ().interrupt(); ("Producer thread is interrupted..."); } }); // Consumer thread Thread consumerThread = new Thread(() -> { try { ("Consumers start to consume..."); while (true) { String item = (); ("Consumed: " + item); } } catch (InterruptedException e) { ().interrupt(); ("The consumer thread is interrupted..."); } }); (); (); } }
3. Things to note
- Capacity control:
- For bounded queues (e.g.
ArrayBlockingQueue
), the initial capacity needs to be set reasonably to avoid frequent capacity expansion operations. - Thread safety:
-
BlockingQueue
The implementation classes are thread-safe and are suitable for task distribution and message delivery in multi-threaded environments. - Performance considerations:
- The performance of different queue implementation classes in insertion, deletion and other operations may be different. For example,
ArrayDeque
Compare the operation on both endsLinkedList
More efficient.
Summarize
Java provides a variety of queue implementations, each with its applicable scenarios:
- If you need a simple first-in first-out behavior, you can choose
LinkedList
orArrayDeque
。 - If you need to process according to element priority, you can use
PriorityQueue
。 - In multi-threaded environment, it is recommended to use
BlockingQueue
and its subclasses to simplify the complexity of task distribution and synchronization.
By rationally selecting and using these queue structures, the efficiency and maintainability of the code can be significantly improved in actual development.
The above is personal experience. I hope you can give you a reference and I hope you can support me more.