Bagi kebanyakan orang, kata "antrean" mengingatkan sedikit asosiasi yang menyenangkan. Tapi hari ini kita berbicara tentang antrian yang berbeda — antrian Java. Di Java, antrian adalah segala sesuatu yang mewarisi antarmuka Antrean , yang pada gilirannya memperluas antarmuka Koleksi . Itu berarti antrian dapat diperlakukan seperti koleksi.

Antrian di Java mendukung dua prinsip operasi: FIFO dan LIFO .

Prinsip FIFO (First In, First Out) mengatur antrean reguler — elemen pertama yang ditambahkan ke antrean adalah yang pertama meninggalkannya.

Prinsip LIFO (Last In, First Out) menjelaskan perilaku stack — elemen terakhir yang ditambahkan ke antrian adalah yang pertama meninggalkannya. Misalnya, ini adalah cara Anda bekerja dengan setumpuk kartu: Anda mengambil kartu dari atas satu per satu sampai Anda mencapai bagian bawah tumpukan.

Hierarki antrian di Java terlihat seperti ini:

Di sini Anda dapat melihat bahwa Queue memiliki 3 kelas implementasi: LinkedList , ArrayDeque dan PriorityQueue . LinkedList dan ArrayDeque secara langsung mewarisi bukan Queue , tapi Deque .

Deque adalah antarmuka yang ditambahkan di Java 6. Ini mencakup beberapa metode yang berguna untuk antrian dan memungkinkan antrian berfungsi sebagai antrian ujung ganda (atau dua arah). Artinya bisaFIFOdanLIFO.

Salah satu dari dua keturunan antarmuka Deque adalah ArrayDeque . Ini mendukung antrian ujung ganda yang memungkinkan Anda memasukkan dan menghapus elemen dari kedua ujungnya. Ini juga merupakan larik dinamis yang ukurannya bertambah secara otomatis.

Ada juga kelas PriorityQueue , yang merupakan keturunan langsung dari Queue : perilakunya berbeda dari kelas yang mengimplementasikan Deque .

PriorityQueue adalah antrean prioritas yang mengatur elemen sesuai urutan alaminya secara default. Di sini penyortiran menggunakan antarmuka Sebanding dan Komparator . Prinsipnya sama dengan TreeSet atau TreeMap — kelas yang menggunakan antarmuka Sebanding dan memiliki tata urutannya sendiri.

PriorityQueue<String> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(String::length));

priorityQueue.add("Andrew");
priorityQueue.add("John");
priorityQueue.add("Rob");

while (!priorityQueue.isEmpty()) {
   System.out.println(priorityQueue.remove());
}

Jika Anda menjalankan contoh ini, inilah yang akan Anda lihat di konsol:

Rob
John
Andrew

Karena kami bekerja dengan antrian dan bukan koleksi biasa, kami perlu menghapus elemen dari daftar. Untuk melakukan ini, kami menggunakan konstruk ini:

while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.remove());
}

Antarmuka Deque mewarisi metode Queue dan menambahkan beberapa metode menariknya sendiri:

batal addFirst(E obj) Menambahkan elemen obj ke depan antrian
batal addLast(E obj) Menambahkan elemen obj ke akhir antrian
E getFirst() Mengembalikan elemen pertama dari antrian
E getLast() Mengembalikan elemen terakhir dari antrian
boolean offerFirst(E obj) Menambahkan elemen obj ke depan antrean, dan mengembalikan true jika elemen ditambahkan. Jika tidak, kembalikan false .
penawaran booleanTerakhir(E obj) Menambahkan elemen obj ke akhir antrian, dan mengembalikan true jika elemen ditambahkan. Jika tidak, kembalikan false .
E pop() Mendapat elemen pertama dari antrian dan menghapusnya
dorongan batal (E obj) Menambahkan elemen obj ke depan antrian
E mengintipPertama() Mengembalikan (tetapi tidak menghapus) elemen pertama dari antrian
E peekLast() Mengembalikan (tetapi tidak menghapus) elemen terakhir dari antrian
E pollFirst() Mengembalikan dan menghapus elemen pertama dari antrian. Mengembalikan nol jika tidak ada elemen.
E pollTerakhir() Mengembalikan dan menghapus elemen terakhir dari antrian. Mengembalikan nol jika tidak ada elemen.
E hapusTerakhir() Mengembalikan dan menghapus elemen pertama dari antrian. Melempar pengecualian jika tidak ada elemen.
E hapusPertama() Mengembalikan dan menghapus elemen terakhir dari antrian. Melempar pengecualian jika tidak ada elemen.
boolean removeFirstOccurrence(Objek objek) Menghapus kejadian pertama objek dari antrian
boolean removeLastOccurrence(Objek objek) Menghapus kejadian terakhir dari objek dari antrian

Sekarang mari kita lihat beberapa metode ini dalam praktiknya.

Pertama, mari tambahkan elemen ke antrean:

Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); // Adds "Apple" to the end of the queue
        deque.addFirst("Orange"); // Adds "Orange" to the front of the queue
        deque.addLast("Pineapple"); // Adds "Pineapple" to the end of the queue

        System.out.println(deque);
[Jeruk, Apel, Nanas]

Sekarang mari kita dapatkan nilai dari antrian:

Deque<String> deque = new ArrayDeque<>();

deque.add("Apple");
        deque.addFirst("Orange");
        deque.addLast("Pineapple");


        System.out.println("The first element is: "+ deque.getFirst());

        System.out.println("The last element is: " + deque.getLast());

    }

Kode ini menampilkan elemen pertama dan terakhir dari antrian.

Elemen pertama adalah: Jeruk
Elemen terakhir adalah: Nanas

Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple");
        deque.addFirst("Orange");
        deque.addLast("Pineapple");
        deque.add("Lemon");

System.out.println(deque.pop()); // Get and remove the first element of the queue
System.out.println(deque.poll()); // Get and remove the first element of the queue

System.out.println(deque);

Menjalankan kode ini, kita mendapatkan:

Jeruk
Apel

[Nanas, Lemon]

Perbedaan antara pop() dan poll() adalah bahwa pop() akan memunculkan NoSuchElementException jika daftarnya adalah daftar kosong, tetapi poll() akan mengembalikan null .

Sekarang kita akan mempertimbangkan metode pollFirst() dan pollLast() .

Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple");
        deque.addFirst("Orange");
        deque.addLast("Pineapple");
        deque.add("Lemon");

System.out.println(deque.pollFirst()); // Get and remove the first element of the queue
System.out.println(deque.pollLast()); // Get and remove the last element of the queue.
System.out.println(deque);
Jeruk
Lemon
[Apel, Nanas]

Kedua metode mengembalikan dan menghapus nilai dari antrian.

Berikut adalah contoh penggunaan metode peekFirst() dan peekLast() :

Deque<String> friends = new ArrayDeque<>();

friends.add("John");
friends.add("Rob");
friends.add("Greg");
friends.add("Max");
friends.add("Oliver");

System.out.println("The first element is: " + friends.peekFirst());
System.out.println("The last element is: " + friends.peekLast());

System.out.println(friends);
Elemen pertama adalah: John
Elemen terakhir adalah: Oliver
[John, Rob, Greg, Max, Oliver]

Kedua metode mengembalikan elemen pertama/terakhir dari antrian dan tidak menghapusnya. Jika antrian kosong, null akan dikembalikan.

Bagus sekali! Hari ini kita belajar bagaimana bekerja dengan antrian di Java. Sekarang Anda tahu cara menggunakannya dalam praktik.