Làm cách nào để khởi tạo một đối tượng Queue trong java?


142

Khi tôi cố gắng:

Queue<Integer> q = new Queue<Integer>();

trình biên dịch đang cho tôi một lỗi. Có ai giúp đỡ không?

Ngoài ra, nếu tôi muốn khởi tạo một hàng đợi, tôi có phải thực hiện các phương thức của hàng đợi không?


2
Bạn có cần hàng đợi để được an toàn chủ đề?
Peter Lawrey

Câu trả lời:


150

A Queuelà một giao diện, có nghĩa là bạn không thể xây dựng Queuetrực tiếp.

Lựa chọn tốt nhất là xây dựng ra một lớp học mà đã thực hiện các Queuegiao diện, như một trong những điều sau đây: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, hoặc SynchronousQueue.

Một cách khác là viết lớp của riêng bạn, thực hiện giao diện Hàng đợi cần thiết. Không cần thiết ngoại trừ trong những trường hợp hiếm hoi mà bạn muốn làm điều gì đó đặc biệt trong khi cung cấp phần còn lại của chương trình của bạn Queue.

public class MyQueue<T extends Tree> implements Queue<T> {
   public T element() {
     ... your code to return an element goes here ...
   }

   public boolean offer(T element) {
     ... your code to accept a submission offer goes here ...
   }

   ... etc ...
}

Một thay thế thậm chí ít được sử dụng là để xây dựng một lớp ẩn danh thực hiện Queue. Bạn có thể không muốn làm điều này, nhưng nó được liệt kê như là một lựa chọn vì mục đích bao trùm tất cả các cơ sở.

new Queue<Tree>() {
   public Tree element() {
     ...
   };

   public boolean offer(Tree element) {
     ...
   };
   ...
};

21
Ôi trời ơi ... tôi sợ ai đó đọc cái này sẽ sử dụng ẩn danh Queue... nhưng dù sao đi nữa.
Tom

1
Thật ra, Jon's rõ ràng hơn. Tôi sẽ +1 cái này nếu bạn cập nhật nó để đề cập đến sự tương tranh và loại bỏ mã cho các lớp ẩn danh ... Tôi nghĩ rằng nó làm cho câu trả lời trở nên khó hiểu hơn cho ai đó muốn biết phải làm gì vì họ gần như chắc chắn không muốn làm việc đó đi. (Ngay cả khi họ muốn lớp học của riêng mình, không cần phải ẩn danh)
Tom

1
@Tom đã không đưa ra thông tin lớp ẩn danh vì thật tốt khi biết điều đó là có thể, nhưng tôi đã đưa vào "Viết bản thực hiện của riêng bạn" trước khi nó khác xa với các lựa chọn thay thế được liệt kê đầu tiên (phổ biến hơn).
Edwin Buck

1
Tại sao không đề cậpArrayDeque
JW.ZG

Tôi không thể tìm thấy phương thức enqueue () trong bất kỳ lớp nào bạn đã đề cập, tôi chỉ có thể tìm phương thức add (), vui lòng sửa cho tôi nếu tôi sai.
Saletanth Karumanaghat

152

Queuelà một giao diện. Bạn không thể khởi tạo giao diện trực tiếp ngoại trừ thông qua lớp bên trong ẩn danh. Thông thường, đây không phải là những gì bạn muốn làm cho một bộ sưu tập. Thay vào đó, chọn một triển khai hiện có. Ví dụ:

Queue<Integer> q = new LinkedList<Integer>();

hoặc là

Queue<Integer> q = new ArrayDeque<Integer>();

Thông thường, bạn chọn triển khai bộ sưu tập theo các đặc tính hiệu suất và tương tranh mà bạn quan tâm.


9
Từ ArrayDeque : "Lớp này có khả năng nhanh hơn Stack khi được sử dụng như một ngăn xếp và nhanh hơn LinkedList khi được sử dụng như một hàng đợi". Đó là do địa phương dữ liệu thân thiện với bộ nhớ cache CPU và phân bổ ít thường xuyên hơn.
Vadzim

42
Queue<String> qe=new LinkedList<String>();

qe.add("b");
qe.add("a");
qe.add("c");

Queuelà một giao diện, bạn không thể tạo một phiên bản của nó như bạn đã minh họa


1
java.util.Queuelà một giao diện. Bạn không thể khởi tạo giao diện. Bạn cần tạo một thể hiện của một lớp thực hiện giao diện đó. Trong trường hợp này, LinkedList là một lớp như vậy.
Mihai Toader

@Tod vâng, đang trên đường .. :)
Jigar Joshi

Cảm ơn @JigarJoshi !! Có cách nào để làm điều tương tự với stack không? Tôi không thể tìm thấy bất cứ điều gì.
Zehra Subaş

@ZehStack<String> stack = new Stack<>(); stack.push("a"); stack.push("b"); System.out.println(stack.pop()); import java.util.Stack;
Jigar Joshi

15

Hàng đợi là một giao diện; bạn không thể xây dựng một hàng đợi một cách rõ ràng. Bạn sẽ phải khởi tạo một trong các lớp thực hiện của nó. Cái gì đó như:

Queue linkedList = new LinkedList();

Đây là một liên kết đến hướng dẫn Java về chủ đề này.


cái này không hoạt động nữa ..! Mặc dù khai báo này đang hoạt động -> Hàng đợi <Ký tự> hàng đợi = new ArrayDeque <Ký tự> ();
Md Faisal

@MdFaisal Hoạt động tốt với tôi với phiên bản java "1.7.0_71"
zmf

12

nhập mô tả hình ảnh ở đây

Giao diện Queue mở rộng java.util.Collection với các thao tác chèn, trích xuất và kiểm tra bổ sung như:

+offer(element: E):boolean // Chèn một phần tử

+poll(): E // Lấy phần tử và trả về NULL nếu hàng đợi trống

+remove(): E// Lấy và xóa phần tử và ném Ngoại lệ nếu hàng đợi trống

+peek(): E// Lấy, nhưng không xóa, phần đầu của hàng đợi này, trả về null nếu hàng đợi này trống.

+element(): E// Lấy, nhưng không loại bỏ, phần đầu của hàng đợi này, sẽ ném một ngoại lệ nếu hàng đợi te trống.

Mã ví dụ để thực hiện Hàng đợi:

java.util.Queue<String> queue = new LinkedList<>();
queue.offer("Hello");
queue.offer("StackOverFlow");
queue.offer("User");

System.out.println(queue.peek());

while (queue.size() > 0){
    System.out.println(queue.remove() + " ");
}
//Since Queue is empty now so this will return NULL
System.out.println(queue.peek());

Đầu ra của mã:

Hello
Hello 
StackOverFlow 
User 
null

7

Hàng đợi là một giao diện trong java, bạn không thể làm điều đó.

Thay vào đó bạn có hai lựa chọn:

lựa chọn 1:

Queue<Integer> Q = new LinkedList<>();

Lựa chọn 2:

Queue<Integer> Q = new ArrayDeque<>();

Tôi khuyên bạn nên sử dụng tùy chọn 2 vì nó nhanh hơn một chút so với cái khác


5

Hàng đợi trong Java được định nghĩa là một giao diện và nhiều triển khai sẵn sàng sử dụng có mặt như một phần của bản phát hành JDK. Dưới đây là một số: LinkedList , Queue Priority, ArrayBlockingQueue, ConcurrencyLinkedQueue, Queue chuyển liên kết, Hàng đợi đồng bộ , v.v.

VẬY Bạn có thể tạo bất kỳ lớp nào trong số này và giữ nó làm tham chiếu Hàng đợi. ví dụ

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

public class QueueExample {

 public static void main (String[] args) {
  Queue que = new LinkedList();
  que.add("first");
  que.offer("second");
  que.offer("third");
  System.out.println("Queue Print:: " + que);
  
  String head = que.element();
  System.out.println("Head element:: " + head);
  
  String element1 = que.poll();
  System.out.println("Removed Element:: " + element1);
  
  System.out.println("Queue Print after poll:: " + que);
  String element2 = que.remove();
  System.out.println("Removed Element:: " + element2);
  
  System.out.println("Queue Print after remove:: " + que);  
 }
}

Bạn cũng có thể triển khai giao diện Hàng đợi tùy chỉnh của riêng mình.


4

Queuelà một giao diện trong java, bạn không thể làm điều đó. thử:

Queue<Integer> Q = new LinkedList<Integer>();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.