Trong hướng dẫn này, chúng ta sẽ tìm hiểu về lớp ArrayDeque và các phương thức của nó với sự trợ giúp của các ví dụ. Ngoài ra, chúng ta sẽ học cách sử dụng mảng deque để triển khai một ngăn xếp.

Trong Java, chúng ta có thể sử dụng lớp ArrayDeque để triển khai các cấu trúc dữ liệu hàng đợi và deque bằng cách sử dụng mảng.

1. Interface ArrayDeque

Các lớp ArrayDeque thực hiện hai interface này:

  • Interface hàng đợi Java
  • Interface Java Deque

2. Tạo ArrayDeque

Để tạo một mảng deque, chúng ta phải nhập gói java.util.ArrayDeque.

Đây là cách chúng ta có thể tạo một mảng deque trong Java:

ArrayDeque<Type> animal = new ArrayDeque<>();

Đây, Kiểucho biết kiểu của mảng deque. Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

// Creating String type ArrayDeque
ArrayDeque<String> animals = new ArrayDeque<>();

// Creating Integer type ArrayDeque
ArrayDeque<Integer> age = new ArrayDeque<>();

3. Các phương thức của ArrayDeque

Lớp ArrayDeque cung cấp triển khai cho tất cả các phương thức hiện tại của Queue và interface Deque.

3.1 Chèn các phần tử vào Deque

1. Thêm các phần tử bằng add (), addFirst () và addLast ()

  • add() – chèn phần tử được chỉ định vào cuối mảng deque
  • addFirst() – chèn phần tử được chỉ định vào đầu mảng deque
  • addLast()- chèn giá trị được chỉ định vào cuối mảng deque (tương đương với add())

Lưu ý: Nếu deque mảng đầy, tất cả các phương thức này: add(), addFirst()và addLast() sẽ ném ra IllegalStateException.

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();

        // Using add()
        animals.add("Dog");

        // Using addFirst()
        animals.addFirst("Cat");

        // Using addLast()
        animals.addLast("Horse");
        System.out.println("ArrayDeque: " + animals);
    }
}

Đầu ra

ArrayDeque: [Cat, Dog, Horse]

2. Chèn các phần tử bằng offer(), offerFirst() và offerLast()

  • offer() – chèn phần tử được chỉ định vào cuối mảng deque
  • offerFirst() – chèn phần tử được chỉ định vào đầu mảng deque
  • offerLast() – chèn phần tử được chỉ định vào cuối mảng deque

Lưu ý: offer() , offerFirst()và offerLast() trả về true nếu phần tử được chèn thành công; nếu mảng deque đầy, các phương thức này trả về false.

Ví dụ,

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();
        // Using offer()
        animals.offer("Dog");

        // Using offerFirst()
        animals.offerFirst("Cat");

        // Using offerLast()
        animals.offerLast("Horse");
        System.out.println("ArrayDeque: " + animals);
    }
}

Đầu ra

ArrayDeque: [Cat, Dog, Horse]

Lưu ý: Nếu mảng deque đầy

  • phương thức add() sẽ ném một ngoại lệ
  • phương thức offer() trở về false

3.2. Truy cập các phần tử ArrayDeque

1. Truy cập các phần tử bằng getFirst () và getLast ()

  • getFirst() – trả về phần tử đầu tiên của mảng deque
  • getLast() – trả về phần tử cuối cùng của mảng deque

Lưu ý: Nếu deque mảng trống getFirst()và getLast()ném ra NoSuchElementException.

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("ArrayDeque: " + animals);

        // Get the first element
        String firstElement = animals.getFirst();
        System.out.println("First Element: " + firstElement);

        // Get the last element
        String lastElement = animals.getLast();
        System.out.println("Last Element: " + lastElement);
    }
}

Đầu ra

ArrayDeque: [Dog, Cat, Horse]
First Element: Dog
Last Element: Horse

2. Truy cập các phần tử bằng phương thức peek (), peekFirst () và peekLast ()

  • peek() – trả về phần tử đầu tiên của mảng deque
  • peekFirst()- trả về phần tử đầu tiên của mảng deque (tương đương với peek())
  • peekLast() – trả về phần tử cuối cùng của mảng deque

Ví dụ,

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("ArrayDeque: " + animals);

        // Using peek()
        String element = animals.peek();
        System.out.println("Head Element: " + element);

        // Using peekFirst()
        String firstElement = animals.peekFirst();
        System.out.println("First Element: " + firstElement);

        // Using peekLast
        String lastElement = animals.peekLast();
        System.out.println("Last Element: " + lastElement);
    }
}

Đầu ra

ArrayDeque: [Dog, Cat, Horse]
Head Element: Dog
First Element: Dog
Last Element: Horse

Lưu ý: Nếu deque mảng rỗng, peek(), peekFirst()và getLast()ném NoSuchElementException.

3.3 Loại bỏ các phần tử ArrayDeque

1. Loại bỏ các phần tử bằng phương thức remove (), removeFirst (), removeLast ()

  • remove() – trả về và xóa một phần tử khỏi phần tử đầu tiên của mảng deque
  • remove(element) – trả về và xóa phần tử được chỉ định khỏi phần đầu của mảng deque
  • removeFirst()- trả về và xóa phần tử đầu tiên khỏi mảng deque (tương đương với remove())
  • removeLast() – trả về và xóa phần tử cuối cùng khỏi mảng deque

Lưu ý: Nếu deque mảng trống phương thứcremove(), removeFirst()và removeLast() ném ra một ngoại lệ. Ngoài ra, remove(element)ném một ngoại lệ nếu phần tử không được tìm thấy.

Ví dụ,

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Cow");
        animals.add("Horse");
        System.out.println("ArrayDeque: " + animals);

        // Using remove()
        String element = animals.remove();
        System.out.println("Removed Element: " + element);

        System.out.println("New ArrayDeque: " + animals);

        // Using removeFirst()
        String firstElement = animals.removeFirst();
        System.out.println("Removed First Element: " + firstElement);

        // Using removeLast()
        String lastElement = animals.removeLast();
        System.out.println("Removed Last Element: " + lastElement);
    }
}

Đầu ra

ArrayDeque: [Dog, Cat, Cow, Horse]
Removed Element: Dog
New ArrayDeque: [Cat, Cow, Horse]
Removed First Element: Cat
Removed Last Element: Horse

2. Loại bỏ các phần tử bằng cách sử dụng phương thức poll(), pollFirst()pollLast()

  • poll() – trả về và xóa phần tử đầu tiên của mảng deque
  • pollFirst()- trả về và xóa phần tử đầu tiên của mảng deque (tương đương với poll())
  • pollLast() – trả về và xóa phần tử cuối cùng của mảng deque

Lưu ý: Nếu deque mảng là rỗng, poll(), pollFirst()và pollLast()sẽ trả về null nếu phần tử không được tìm thấy.

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Group: https://www.facebook.com/groups/cafedev.vn/
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
Pinterest: https://www.pinterest.com/cafedevvn/
YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
*/

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Cow");
        animals.add("Horse");
        System.out.println("ArrayDeque: " + animals);

        // Using poll()
        String element = animals.poll();
        System.out.println("Removed Element: " + element);
        System.out.println("New ArrayDeque: " + animals);

        // Using pollFirst()
        String firstElement = animals.pollFirst();
        System.out.println("Removed First Element: " + firstElement);

        // Using pollLast()
        String lastElement = animals.pollLast();
        System.out.println("Removed Last Element: " + lastElement);
    }
}

Đầu ra

ArrayDeque: [Dog, Cat, Cow, Horse]
Removed Element: Dog
New ArrayDeque: [Cat, Cow, Horse]
Removed First Element: Cat
Removed Last Element: Horse

3. Loại bỏ phần tử: sử dụng phương thức clear ()

Để xóa tất cả các phần tử khỏi mảng deque, chúng ta sử dụng phương thức clear(). Ví dụ,

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("ArrayDeque: " + animals);

        // Using clear()
        animals.clear();

        System.out.println("New ArrayDeque: " + animals);
    }
}

Đầu ra

ArrayDeque: [Dog, Cat, Horse]
New ArrayDeque: []

3.4 Lặp lại ArrayDeque

  • iterator() – trả về một trình lặp có thể được sử dụng để lặp lại trên mảng deque
  • descendingIterator() – trả về một trình lặp có thể được sử dụng để lặp lại trên mảng deque theo thứ tự ngược lại

Để sử dụng các phương thức này, chúng ta phải nhập gói java.util.Iterator. Ví dụ,

import java.util.ArrayDeque;
import java.util.Iterator;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> animals= new ArrayDeque<>();
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");

        System.out.print("ArrayDeque: ");

        // Using iterator()
        Iterator<String> iterate = animals.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }

        System.out.print("\nArrayDeque in reverse order: ");
        // Using descendingIterator()
        Iterator<String> desIterate = animals.descendingIterator();
        while(desIterate.hasNext()) {
            System.out.print(desIterate.next());
            System.out.print(", ");
        }
    }
}

Đầu ra

ArrayDeque: [Dog, Cat, Horse]
ArrayDeque in reverse order: [Horse, Cat, Dog]

4. Các phương thức khác

Phương thứcMô tả
element()Trả về một phần tử từ phần đầu của mảng deque.
contains(element)Tìm kiếm mảng deque cho phần tử được chỉ định.Nếu phần tử được tìm thấy, nó sẽ trả về true, nếu không nó sẽ trả về false.
size()Trả về độ dài của mảng deque.
toArray()Chuyển đổi deque mảng thành mảng và trả về nó.
clone()Tạo một bản sao của mảng deque và trả về nó.

5. ArrayDeque như một ngăn xếp

Để triển khai ngăn xếp LIFO (Last-In-First-Out) trong Java, bạn nên sử dụng một deque trên lớp Stack . Các lớp ArrayDeque có khả năng nhanh hơn so với lớp Stack.

ArrayDeque cung cấp các phương thức sau có thể được sử dụng để triển khai ngăn xếp.

  • push() – thêm một phần tử vào đầu ngăn xếp
  • peek() – trả về một phần tử từ trên cùng của ngăn xếp
  • pop() – trả về và xóa một phần tử khỏi đầu ngăn xếp

Ví dụ,

import java.util.ArrayDeque;

class Main {
    public static void main(String[] args) {
        ArrayDeque<String> stack = new ArrayDeque<>();

        // Add elements to stack
        stack.push("Dog");
        stack.push("Cat");
        stack.push("Horse");
        System.out.println("Stack: " + stack);

        // Access element from top of stack
        String element = stack.peek();
        System.out.println("Accessed Element: " + element);

        // Remove elements from top of stack
        String remElement = stack.pop();
        System.out.println("Removed element: " + remElement);
    }
}

Đầu ra

Stack: [Horse, Cat, Dog]
Accessed Element: Horse
Removed Element: Horse

6. ArrayDeque Vs. Lớp danh sách liên kết

Cả hai ArrayDeque và Java LinkedList thực hiện interface Deque. Tuy nhiên, tồn tại một số khác biệt giữa chúng.

  • LinkedList hỗ trợ các phần tử null, trong khi ArrayDeque thì không.
  • Mỗi nút trong danh sách liên kết bao gồm các liên kết đến các nút khác. Đó là lý do tại sao LinkedList yêu cầu lưu trữ nhiều hơn ArrayDeque.
  • Nếu bạn đang triển khai hàng đợi hoặc cấu trúc dữ liệu deque, một ArrayDeque có thể nhanh hơn a LinkedList.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!