Hàng đợi là gì?
Đúng như tên gọi, Queue là một cấu trúc dữ liệu phổ biến trong Java theo thứ tự chèn First In First Out (FIFO) . Bạn có thể dễ dàng tưởng tượng nó giống như một hàng đợi tại một cửa hàng tạp hóa. Bạn vào càng sớm, bạn càng rời đi sớm. Điều đó có nghĩa là phần tử được thêm vào hàng đợi sớm hơn cũng sẽ rời đi sớm hơn. Phần tử đầu tiên (phía trước) của hàng đợi còn được gọi là phần đầu .
Phương thức poll() của Queue là gì?
Phương thức poll() cho phép bạn truy xuất và xóa phần tử trên cùng (phần đầu) của Hàng đợi. Trong ví dụ của chúng tôi, khi bạn gọi poll() ở hàng đợi trên, kết quả là bạn sẽ nhận được '1'. Và sẽ chỉ còn lại 4 phần tử trong hàng đợi.
phương thức thăm dò () trong Java
ví dụ 1
Hãy xem một ví dụ đơn giản về cách gọi hàm poll() trên hàng đợi được minh họa trong hình 1.0.
import java.util.LinkedList;
import java.util.Queue;
public class QueuePollMethod {
public static void main(String[] args) {
// create a queue of die rolls
Queue dieRoll = new LinkedList();
// Add 6 integers one by one
dieRoll.add(1);
dieRoll.add(2);
dieRoll.add(3);
dieRoll.add(4);
dieRoll.add(5);
dieRoll.add(6);
// print the original queue
System.out.println("Queue:\t" + dieRoll + "\n");
// after calling poll()
System.out.println("poll() returned : " + dieRoll.poll());
System.out.println("Queue Updated!\t" + dieRoll + "\n");
// after calling poll()
System.out.println("poll() returned : " + dieRoll.poll());
System.out.println("Queue Updated!\t" + dieRoll + "\n");
// after calling poll()
System.out.println("poll() returned : " + dieRoll.poll());
System.out.println("Queue Updated!\t" + dieRoll + "\n");
}
}
đầu ra
Hàng đợi: [1, 2, 3, 4, 5, 6]
thăm dò ý kiến() trả về : 1
Đã cập nhật hàng đợi! [2, 3, 4, 5, 6]
thăm dò ý kiến() trả về : 2
Đã cập nhật hàng đợi! [3, 4, 5, 6]
thăm dò ý kiến() đã trả về : 3
Đã cập nhật hàng đợi! [4, 5, 6]
Xin lưu ý, làm thế nào sau mỗi poll() kích thước cuộc gọi của hàng đợi giảm đi 1 và đầu được trả về.
ví dụ 2
Hãy xem một ví dụ khác về các ngày trong một tuần. Chúng ta sẽ gọi poll() từng cái một vào các ngày trong tuần và xem nó trông như thế nào.
import java.util.LinkedList;
import java.util.Queue;
public class QueuePollMethod {
public static void main(String[] args) {
Queue days = new LinkedList();
days.add("Sunday");
days.add("Monday");
days.add("Tuesday");
days.add("Wednesday");
days.add("Thursday");
days.add("Friday");
days.add("Saturday");
// print all the days in the week
System.out.println("Week Days: \t" + days + "\n");
// after calling poll()
System.out.println("poll() returned: " + days.poll());
System.out.println("Days Updated!\t" + days + "\n");
// after calling poll()
System.out.println("poll() returned: " + days.poll());
System.out.println("Days Updated!\t" + days + "\n");
// after calling poll()
System.out.println("poll() returned: " + days.poll());
System.out.println("Days Updated!\t" + days + "\n");
}
}
đầu ra
Ngày trong tuần: [Chủ Nhật, Thứ Hai, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu, Thứ Bảy]
poll() đã trả về: Chủ nhật
Ngày cập nhật! [Thứ hai thứ ba thứ tư thứ năm thứ sáu thứ bảy]
poll() đã trả về: Thứ Hai
Ngày cập nhật! [Thứ ba thứ tư thứ năm thứ sáu thứ Bảy]
poll() đã trả về: Thứ ba
Ngày cập nhật! [Thứ tư thứ năm thứ sáu Thứ Bảy]
Poll() khác với peek() và remove() như thế nào?
Người mới bắt đầu rất dễ nhầm lẫn ba khái niệm khác nhau vì chúng trông khá giống nhau. Giả sử “q” là một hàng đợi, sau đây là cách chúng khác nhau:- q.poll() : xóa và lấy phần đầu của hàng đợi
- q.peek() : không xóa mà chỉ truy xuất/trả về phần đầu của hàng đợi
- q.remove() : xóa và lấy phần đầu của hàng đợi
ví dụ 3
Bây giờ chúng ta hãy xem nhanh một vài ví dụ về ba chức năng trên.
import java.util.LinkedList;
import java.util.Queue;
public class QueuePollMethod {
public static void main(String[] args) {
Queue days = new LinkedList();
days.add("Sunday");
days.add("Monday");
days.add("Tuesday");
days.add("Wednesday");
days.add("Thursday");
days.add("Friday");
days.add("Saturday");
// print all the days in the week
System.out.println("Week Days: \t" + days + "\n");
// after calling peek()
System.out.println("peek() returned: " + days.peek());
System.out.println("Week Days: \t" + days + "\n");
System.out.println("peek() returned: " + days.peek());
System.out.println("Week Days: \t" + days + "\n");
// after calling remove()
System.out.println("remove() returned: " + days.remove());
System.out.println("Days Updated!\t" + days + "\n");
System.out.println("remove() returned: " + days.remove());
System.out.println("Days Updated!\t" + days + "\n");
System.out.println("remove() returned: " + days.remove());
System.out.println("remove() returned: " + days.remove());
System.out.println("remove() returned: " + days.remove());
System.out.println("remove() returned: " + days.remove());
System.out.println("Days Updated!\t" + days + "\n");
// after calling poll()
System.out.println("poll() returned: " + days.poll());
System.out.println("Days Updated!\t" + days + "\n");
System.out.println("poll() returned: " + days.poll());
System.out.println("remove() returned: " + days.remove());
}
}
đầu ra
Ngày trong tuần: [Chủ Nhật, Thứ Hai, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu, Thứ Bảy]
look() đã trả về: Chủ nhật
Ngày trong tuần: [Chủ Nhật, Thứ Hai, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu, Thứ Bảy]
look() đã trả về: Chủ nhật
Ngày trong tuần: [Chủ Nhật, Thứ Hai, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu, Thứ Bảy]
Remove() trả về: Chủ nhật
Ngày cập nhật! [Thứ hai thứ ba thứ tư thứ năm thứ sáu thứ bảy]
Remove() đã trả về: Thứ Hai
Ngày cập nhật! [Thứ ba thứ tư thứ năm thứ sáu thứ Bảy]
Remove() đã trả về: Thứ ba
Remove() đã trả về: Thứ Tư
Remove() đã trả về: Thứ năm
Remove() đã trả về: Thứ sáu
Ngày cập nhật! [Thứ bảy]
poll() đã trả về: Thứ bảy
Ngày cập nhật! []
thăm dò ý kiến() trả về: null
Ngoại lệ trong luồng "chính" java.util.NoSuchElementException
tại java.util.LinkedList.removeFirst(LinkedList.java:270)
tại java.util.LinkedList.remove(LinkedList.java:685)
tại QueuePollMethod.main(QueuePollMethod.java:48)
Như bạn có thể thấy sau khi gọi peek() các ngày trong tuần vẫn giữ nguyên. Và khi chúng ta sử dụng remove() hoặc poll(), kích thước của hàng đợi sẽ giảm đi 1 cùng với việc trả về phần đầu. Hơn nữa, java.util.NoSuchElementException được ném ra khi chúng ta gọi remove() tại một hàng đợi trống, trong khi không có ngoại lệ nào được ném ra để sử dụng poll() .
GO TO FULL VERSION