ฉันจะสร้างอินสแตนซ์ของวัตถุคิวใน Java ได้อย่างไร


142

เมื่อฉันลอง:

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

คอมไพเลอร์ให้ข้อผิดพลาดแก่ฉัน ความช่วยเหลือใด ๆ

นอกจากนี้หากฉันต้องการเริ่มต้นคิวฉันต้องใช้วิธีการของคิวหรือไม่


2
คุณต้องการคิวเพื่อให้เธรดปลอดภัยหรือไม่?
Peter Lawrey

1
Queueเป็นส่วนต่อประสาน grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/ ......
roottraveller

คำตอบ:


151

A Queueคืออินเตอร์เฟสซึ่งหมายความว่าคุณไม่สามารถสร้าง a Queueได้โดยตรง

เลือกที่ดีที่สุดคือการสร้างปิดชั้นเรียนที่มีอยู่แล้วดำเนินการQueueอินเตอร์เฟซอย่างหนึ่งต่อไปนี้: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, หรือPriorityQueueSynchronousQueue

อีกทางเลือกหนึ่งคือการเขียนคลาสของคุณเองซึ่งใช้อินเตอร์เฟสคิวที่จำเป็น 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 ...
}

Queueทางเลือกแม้กระทั่งการใช้งานน้อยคือการสร้างชั้นที่ไม่ระบุชื่อที่ใช้ คุณอาจไม่ต้องการทำสิ่งนี้ แต่มันถูกระบุว่าเป็นตัวเลือกเพื่อครอบคลุมฐานทั้งหมด

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

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

21
โอ้ที่รัก ... ฉันกลัวว่าใครบางคนที่อ่านข้อความนี้จะใช้แบบไม่ระบุชื่อQueue... แต่ +1 ต่อไป
Tom

1
ที่จริงแล้วจอนชัดเจนกว่า ฉันจะ +1 สิ่งนี้ถ้าคุณอัปเดตเพื่อพูดถึงการทำงานพร้อมกันและกำจัดรหัสสำหรับคลาสที่ไม่ระบุชื่อ ... ฉันคิดว่ามันทำให้คำตอบสับสนมากขึ้นสำหรับคนที่ต้องการรู้ว่าจะทำอย่างไรเพราะพวกเขาแทบจะไม่ต้องการ ทำอย่างนั้น. (แม้ว่าพวกเขาต้องการชั้นเรียนของตัวเองก็ไม่จำเป็นต้องเปิดเผยชื่อ)
Tom

1
@ Tom ไม่ได้นำข้อมูลคลาสที่ไม่ระบุชื่อออกมาเพราะเป็นการดีที่จะรู้ว่าเป็นไปได้ แต่ฉันใส่ใน "เขียนการใช้งานของคุณเอง" ก่อนที่มันจะอยู่ในระยะทางที่ไกลออกไปจากทางเลือกแรก
Edwin Buck

1
ทำไมไม่พูดถึงArrayDeque
JW.ZG

ฉันไม่สามารถค้นหา enqueue () วิธีการในชั้นเรียนที่คุณกล่าวถึงฉันสามารถหาวิธีเพิ่ม () ได้เพียงโปรดแก้ไขฉันหากฉันผิด
Sreekanth Karumanaghat

152

Queueเป็นส่วนต่อประสาน คุณไม่สามารถสร้างอินเทอร์เฟซให้กับอินสแตนซ์ได้โดยตรงยกเว้นผ่านคลาสภายในที่ไม่ระบุชื่อ โดยทั่วไปแล้วนี่ไม่ใช่สิ่งที่คุณต้องการทำสำหรับคอลเลกชัน เลือกการใช้งานที่มีอยู่แทน ตัวอย่างเช่น:

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

หรือ

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

โดยทั่วไปแล้วคุณจะเลือกใช้คอลเลกชันตามประสิทธิภาพและคุณสมบัติการทำงานพร้อมกันที่คุณสนใจ


9
จากArrayDeque : "คลาสนี้น่าจะเร็วกว่าสแต็กเมื่อใช้เป็นสแต็กและเร็วกว่า LinkedList เมื่อใช้เป็นคิว" เป็นเพราะตำแหน่งข้อมูลที่เป็นมิตรกับ CPU แคชและการจัดสรรที่น้อยกว่าบ่อยครั้ง
Vadzim

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

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

เนื่องจากQueueเป็นอินเทอร์เฟซคุณจึงไม่สามารถสร้างอินสแตนซ์ของมันได้ตามที่แสดง


1
java.util.Queueเป็นส่วนต่อประสาน คุณไม่สามารถยกตัวอย่างอินเทอร์เฟซ คุณต้องสร้างอินสแตนซ์ของคลาสที่ใช้อินเทอร์เฟซนั้น ในกรณีนี้ LinkedList จะเป็นคลาสดังกล่าว
Mihai Toader

ใช่ @Tod เป็นในทางที่ .. :)
Jigar Joshi

ขอบคุณ @JigarJoshi !! มีวิธีการทำสิ่งเดียวกันกับกองซ้อนหรือไม่ ฉันหาอะไรไม่เจอ
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

คิวเป็นส่วนต่อประสาน คุณไม่สามารถสร้างคิวได้อย่างชัดเจน คุณจะต้องยกตัวอย่างหนึ่งของชั้นเรียนการใช้งานของมัน สิ่งที่ต้องการ:

Queue linkedList = new LinkedList();

นี่คือลิงค์ไปยังบทช่วยสอนเกี่ยวกับ Java ในหัวข้อนี้


มันไม่ทำงานอีกต่อไป .. ! แม้ว่าการประกาศนี้จะทำงาน -> Queue <Character> que = new ArrayDeque <Character> ();
Mais Faisal

@MdFaisal ธิดีสำหรับฉัน w / Java รุ่น "1.7.0_71"
ZMF

12

ป้อนคำอธิบายรูปภาพที่นี่

อินเตอร์เฟส Queue ขยาย java.util.Collection ด้วยการดำเนินการเพิ่มเติมการแยกและการตรวจสอบเพิ่มเติมเช่น:

+offer(element: E):บูลีน // การแทรกองค์ประกอบ

+poll(): E // ดึงองค์ประกอบและผลตอบแทน NULL ถ้าคิวว่างเปล่า

+remove(): E// ดึงและลบองค์ประกอบและส่งข้อยกเว้นถ้าคิวว่างเปล่า

+peek(): E// ดึงข้อมูล แต่ไม่ได้ลบส่วนหัวของคิวนี้คืนค่า null หากคิวนี้ว่างเปล่า

+element(): E// ดึงข้อมูล แต่ไม่ได้เอาออกหัวของคิวนี้จะส่งข้อยกเว้นถ้าคิวว่างเปล่า

ตัวอย่างรหัสสำหรับการนำคิวไปใช้:

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

เอาท์พุทของรหัส:

Hello
Hello 
StackOverFlow 
User 
null

7

Queue เป็นอินเตอร์เฟสใน java คุณไม่สามารถทำเช่นนั้นได้

คุณมีสองทางเลือกแทน:

ตัวเลือกที่ 1:

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

option2:

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

ฉันแนะนำให้ใช้ option2 เพราะมันเร็วกว่าบิตอื่น ๆ


5

คิวใน Javaถูกกำหนดให้เป็นส่วนต่อประสานและการนำไปใช้งานแบบพร้อมใช้งานจำนวนมากนั้นมีอยู่เป็นส่วนหนึ่งของการเปิดตัว JDK นี่คือบางส่วน: LinkedList , คิวลำดับความสำคัญ, ArrayBlockingQueue, ConcurrentLinkedQueue, คิวถ่ายโอนที่เชื่อมโยง, คิวซิงโครนัสเป็นต้น

ดังนั้นคุณสามารถสร้างคลาสเหล่านี้และถือเป็นอ้างอิงคิว ตัวอย่างเช่น

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

คุณยังสามารถใช้คิวที่กำหนดเองของคุณเองได้


4

Queueเป็นอินเตอร์เฟสใน java คุณไม่สามารถทำเช่นนั้นได้ ลอง:

Queue<Integer> Q = new LinkedList<Integer>();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.