2009-04-29 35 views

Trả lời

7

Các tài liệu cho Queue danh sách triển khai khác nhau, bao gồm

Chọn một thực hiện phù hợp với nhu cầu của bạn.

+0

Theo http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html, ArrayList không thực hiện Queue. –

+0

Vâng, tôi nhận ra rằng một khi tôi quay trở lại để có được một vài liên kết; rõ ràng bộ nhớ của tôi bị lỗi. – Rob

+2

Điều đó xảy ra. Tôi sẽ rất ấn tượng nếu bạn có toàn bộ thư viện Java được ghi nhớ. Nếu bạn có EE ghi nhớ tôi sẽ quay trở lại từ từ. –

31

Javadocs cung cấp danh sách các lớp triển khai Queue.

Tất cả các lớp Thực hiện Known:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedBlockingDeque, LinkedList, PriorityBlockingQueue, PriorityQueue, SynchronousQueue

Ngoài ra còn có một số subinterface đó bạn có thể thấy hữu ích:

Tất cả các subinterface biết:

BlockingDeque < E>, BlockingQueue < E>, Deque < E>

+9

Tự hỏi tại sao mọi người không truy cập JavaDocs: P +1 – Perpetualcoder

+4

isnt Stack Overflow nhanh hơn google? – IAdapter

+5

Đối với những người thực sự lười biếng, tôi sẽ lưu ý rằng tất cả những người có DeQue là hàng đợi đôi. – Powerlord

10

Queue có nhiều triển khai: từ API:

Tất cả Các lớp triển khai đã biết:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, 
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, 
PriorityBlockingQueue, PriorityQueue, SynchronousQueue 

Lưu ý rằng AbstractQueue không phải là một lớp cụ thể.

Một số trong số này là từ gói đồng thời, vì vậy nếu bạn đang thực hiện một jobqueue hoặc một cái gì đó tương tự, bạn nên đi cho ConcurrentLinkedQueue hoặc PriorityBlockingQueue (cho một heap) cho ex.

3

Cũng như sử dụng tài liệu API để tìm "tất cả các lớp triển khai đã biết", thường có các triển khai ngoài công lập khác có sẵn thông qua API công cộng (chỉ mà không yêu cầu tài liệu vô nghĩa). Nếu bạn nhấp vào "use", bạn cũng sẽ tìm thấy Collections.asLifoQueue (Deque đã là Queue, nhưng nó là FIFO chứ không phải là ngăn xếp).

+0

Mỗi lần như vậy, tôi lại khám phá các trang "Sử dụng" và nghĩ, "Này, điều này thật tuyệt!" Và sau đó tôi quên chúng một lần nữa. –

+0

Trang "sử dụng" không có giao diện người dùng lớn nhất. –

2

Mặc dù câu trả lời nghe có vẻ khinh miệt, Chúng thực sự khá tuyệt vời khi dạy bạn cách câu cá.Hàng đợi chỉ đơn giản là một cách để xem bộ sưu tập, vì vậy nhiều bộ sưu tập có thể triển khai bộ sưu tập đó. Đồng thời, những thứ hoạt động như bộ sưu tập nhưng với logic cụ thể khác (như hàng đợi luồng) có thể sử dụng cùng một giao diện.

Biết nơi để xem javadocs là một trợ giúp lớn. Tôi chắc chắn bạn đã nhìn nhưng không nghĩ đến việc xem xét các triển khai. Sống và học hỏi.

Đôi khi bạn cũng có thể phải theo dõi danh sách phụ/mở rộng. Giống như khi bạn nhìn vào Hàng đợi và thấy AbstractQueue, bạn có thể muốn xem những lớp nào thực hiện điều đó.

tôi sẽ thoát khỏi một trong -1s của bạn cho ya :)

0
import java.util.Queue; 

chỉ là

Enqueue function == Queue_Object.add(input_value); 

Dequeue function == Queue_Object.pull(); //return the value and delete it from queue 
2

Không, không có lớp Queue, bởi vì có rất nhiều cách khác nhau để thực hiện một hàng đợi và bạn phải chọn một hàng phù hợp với trường hợp sử dụng của bạn. Điều tương tự cũng xảy ra đối với bất kỳ bộ sưu tập nào khác trong khung công tác bộ sưu tập - ví dụ: ArrayListLinkedList cả hai đều triển khai List. Mẫu chung, là cách sử dụng tốt đối tượng thừa kế, là:

Giao diện , ví dụ: Queue, xác định vai trò bạn muốn đối tượng phát;

Giao diện phụ, ví dụ: Deque, tiếp tục mở rộng hoặc chuyên vai trò - trong trường hợp này hàng đợi "deque" hoặc double-ended cho phép bạn thêm và xóa các phần tử từ cả hai đầu của hàng đợi, trái ngược với chỉ thêm vào mặt sau và xóa khỏi mặt trước;

Lớp học cung cấp cách thực hiện cách đối tượng thực hiện vai trò. Ví dụ: ArrayDeque sử dụng mảng có thể thay đổi kích thước để triển khai hàng đợi có hai hàng, có các điểm mạnh và điểm yếu khác nhau cho LinkedList sử dụng danh sách được liên kết.

Để xây dựng trên ý tưởng về một giao diện như vai trò, lưu ý rằng mặc dù ArrayDeque thực hiện Deque, bạn có thể sử dụng nó như một Queue mà không cần phải lo lắng về điều đó vì thực hiện cả hai giao diện có nghĩa là nó có thể chơi cả hai vai trò. Tương tự, LinkedList có thể đội mũ List, Queue hoặc Deque.

Vì lý do này, cách thông thường (được khuyến nghị) để sử dụng thứ gì đó như khung Bộ sưu tập là chương trình đến giao diện, nghĩa là sử dụng giao diện khi sử dụng lớp thay vì tên lớp. Ví dụ, bạn sẽ tạo một đối tượng như thế này:

Queue<String> logQueue = new ConcurrentLinkedQueue<String>(); 
... 
logQueue.add("Log message"); 

Bằng cách này bạn có

  • không gắn với một lớp học đặc biệt và có thể sử dụng một thả thay thế nếu cần thiết mà không cần phải sửa đổi nhiều và
  • đang ghi lại những gì bạn đang làm với một lớp học bằng cách đặt tên cho vai trò của nó. Nguyên tắc chung giúp với mã này là mã tự ghi, về cơ bản là để cho chính mã đó tự giải thích mà không phải sử dụng nhận xét, v.v.
1
Queue<Integer> queue = new LinkedList<>(); 

queue.add(1); 
queue.add(2); 
queue.add(3); 

while (!queue.isEmpty()) { 
    System.out.println(queue.remove());// prints 1 2 3 
} 
Các vấn đề liên quan