Trong bài này, chúng ta sẽ tìm hiểu về class ArrayDeque và các hàm của nó qua các ví dụ. Ngoài ra, chúng ta sẽ học cách sử dụng ArrayDeque để triển khai một stack.

Trong Java, chúng ta có thể sử dụng class ArrayDeque để triển khai các cấu trúc dữ liệu queuedeque bằng cách sử dụng các mảng.

Các interface được triển khai bởi ArrayDeque

Class ArrayDeque triển khai hai interface sau:

1. Tạo ArrayDeque

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

Sau đây là cách chúng ta có thể tạo một ArrayDeque trong Java:

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

Ở đây, Type là kiểu dữ liệu của ArrayDeque. Ví dụ,

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

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

2. Các hàm của ArrayDeque

Class ArrayDeque triển khai cho tất cả các hàm có trong Queue interface và Deque interface.

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

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

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

Lưu ý: Nếu ArrayDeque đầy, tất cả các hàm add(), addFirst() và addLast() này sẽ ném một 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
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

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);
    }
}

Kết quả

ArrayDeque: [Cat, Dog, Horse]

2. Chèn các phần tử bằng cách sử dụng các hàm Offer (), OfferFirst () và OfferLast ()

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

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

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
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

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);
    }
}

Kết quả

ArrayDeque: [Cat, Dog, Horse]

Lưu ý: Nếu ArrayDeque đầy

  • hàm add() sẽ ném một ngoại lệ
  • hàm offer() trả về false

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

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

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

Lưu ý: Nếu ArrayDeque trống thì hàm getFirst() và getLast() ném một  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
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

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);
    }
}

Kết quả

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

2. Truy cập các phần tử bằng hàm peek (), peekFirst () và peekLast ()

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

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
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

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);
    }
}

Kết quả

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

Lưu ý: Nếu ArrayDeque rỗng, các hàm peek(), peekFirst() và getLast() sẽ ném một NoSuchElementException.

5. Xóa các phần tử khỏi ArrayDeque

1. Xóa các phần tử bằng hàm remove (), removeFirst (), removeLast ()

  • remove() – trả về và loại bỏ phần tử đầu tiên của ArrayDeque
  • remove(element) – trả về và loại bỏ phần tử đã chỉ định khỏi phần đầu của ArrayDeque
  • removeFirst()- trả về và loại bỏ phần tử đầu tiên khỏi ArrayDeque (tương đương với remove())
  • removeLast() – trả về và loại bỏ phần tử cuối cùng khỏi ArrayDeque

Lưu ý: Nếu ArrayDeque rỗng, các hàm remove(), removeFirst() và removeLast() sẽ ném một ngoại lệ. Ngoài ra, hàm remove(element) sẽ ném một ngoại lệ nếu không tìm thấy phần tử.

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
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

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);
    }
}

Kết quả

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

2. Xóa các phần tử bằng hàm poll (), pollFirst () và pollLast ()

  • poll() – trả về và loại bỏ phần tử đầu tiên của ArrayDeque
  • pollFirst()- trả về và loại bỏ phần tử đầu tiên của ArrayDeque (tương đương poll())
  • pollLast() – trả về và loại bỏ phần tử cuối cùng của ArrayDeque

Lưu ý: Nếu ArrayDeque rỗng, các hàm poll(), pollFirst() và pollLast() trả về nullnế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
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

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);
    }
}

Kết quả

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

3. Xóa phần tử: sử dụng hàm clear ()

Để loại bỏ tất cả các phần tử khỏi ArrayDeque, chúng ta sử dụng hàm clear(). 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
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

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);
    }
}

Kết quả

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

6. Lặp với ArrayDeque

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

Để sử dụng các hàm này, chúng ta phải nhập gói java.util.Iterator. 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
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

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(", ");
        }
    }
}

Kết quả

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

7. Các hàm khác

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

8. ArrayDeque như một stack

Để triển khai stack LIFO (Last-In-First-Out) trong Java, nên sử dụng một deque thay vì sử dụng class Stack . Class ArrayDeque thường nhanh hơn so với class Stack.

ArrayDeque cung cấp các hàm sau có thể được sử dụng để triển khai stack.

  • push() – thêm một phần tử vào đầu stack
  • peek() – trả về một phần tử từ đầu stack
  • pop() – trả về và xóa một phần tử ở đầu stack

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);
    }
}

Kết quả

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

9. ArrayDeque Vs. Class LinkedList

Cả ArrayDeque và Class LinkedList trong Java đều triển khai Deque interface. Tuy nhiên, có một số điểm khác biệt giữa chúng.

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

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