Triển Khai Hàng Đợi FIFO trong Java: So Sánh LinkedList và ArrayDeque

Hàng đợi (Queue) tuân theo nguyên tắc FIFO (Vào trước ra trước) là cấu trúc dữ liệu cơ bản trong lập trình, đặc biệt hữu ích cho các tác vụ xử lý tuần tự như quản lý tác vụ, bộ đệm dữ liệu. Trong Java, hai lớp chính hỗ trợ triển khai hàng đợi hiệu quả là LinkedListArrayDeque, đều cung cấp giao diện Queue từ thư viện Collections Framework.

LinkedList hoạt động như hàng đợi nhờ cơ chế danh sách liên kết hai chiều. Để thêm phần tử vào cuối hàng đợi, phương thức offer() được sử dụng thay vì add() nhằm tuân thủ giao diện Queue. Thao tác lấy phần tử đầu hàng đợi kết hợp với xóa bỏ được thực hiện qua poll(). Ví dụ sau minh họa quy trình xử lý tác vụ:

import java.util.LinkedList;
import java.util.Queue;

public class FIFODemo {
    public static void main(String[] args) {
        Queue<String> taskQueue = new LinkedList<>();
        taskQueue.offer("Xử lý văn bản");
        taskQueue.offer("Gửi email");
        taskQueue.offer("Lưu dữ liệu");

        while (!taskQueue.isEmpty()) {
            String currentTask = taskQueue.poll();
            System.out.println("Đang thực hiện: " + currentTask);
        }
    }
}

Kết quả thực thi:

Đang thực hiện: Xử lý văn bản
Đang thực hiện: Gửi email
Đang thực hiện: Lưu dữ liệu

Đối với ArrayDeque, đây là triển khai hàng đợi dựa trên mảng vòng với hiệu năng tối ưu. Lớp này hỗ trợ đầy đủ thao tác hàng đợi thông qua giao diện Queue, đồng thời cho phép thao tác ở cả hai đầu (deque). Ví dụ sử dụng:

import java.util.ArrayDeque;
import java.util.Queue;

public class BufferExample {
    public static void main(String[] args) {
        Queue<String> streamBuffer = new ArrayDeque<>();
        streamBuffer.offer("Frame 1");
        streamBuffer.offer("Frame 2");
        streamBuffer.offer("Frame 3");

        while (!streamBuffer.isEmpty()) {
            System.out.println("Phát phát: " + streamBuffer.poll());
        }
    }
}

Cơ chế mảng vòng của ArrayDeque cho phép quản lý bộ nhớ linh hoạt. Khi thêm phần tử, chỉ số cuối được tính modulo kích thước mảng hiện tại. Khi dung lượng đạt giới hạn, mảng tự động mở rộng gấp đôi kích thước, đồng thời sao chép dữ liệu sang không gian mới. Ngược lại, khi số phần tử giảm xuống dưới 25% dung lượng, mảng được thu nhỏ để tối ưu tài nguyên. Điều này đảm bảo hiệu suất cao cho cả thao tác chèn và xóa ở cả hai đầu cấu trúc dữ liệu.

Thẻ: Java fifo LinkedList ArrayDeque

Đăng vào ngày 5 tháng 6 lúc 20:57