prioridad - priority queue java
¿Dónde está la clase Queue en las Colecciones de Java? (8)
Además de utilizar los documentos de API para encontrar "todas las clases de implementación conocidas", a menudo hay otras implementaciones no públicas que, sin embargo, están disponibles a través de la API pública (solo sin requerir resmas de documentación inútil). Si hace clic en " usar ", también encontrará Collections.asLifoQueue ( Deque
ya es una Queue
, pero es FIFO en lugar de una pila).
Solo veo una interfaz Queue, ¿no hay clase Queue en las Colecciones Java?
Aunque las respuestas suenan desdeñosas, en realidad están siendo geniales enseñándote a pescar. Una cola es simplemente una forma de ver una colección, por lo que muchas colecciones pueden implementarla. Además, las cosas que actúan como colecciones pero con otra lógica específica (como las colas de hilos) pueden usar la misma interfaz.
Saber dónde mirar los javadocs es una gran ayuda. Estoy seguro de que miraste pero no pensaste en mirar las implementaciones. Vive y aprende.
A veces también puede tener que buscar listas de subclase / ampliaciones. Como si mirases a Queue y veas AbstractQueue, es posible que quieras ver qué clases implementan eso.
Me desharé de uno de tus -1 para ti :)
La documentación de Queue
enumera varias implementaciones, incluidas
Elija una implementación que se adapte a sus necesidades.
Queue tiene múltiples implementaciones: desde la API:
Todas las clases de implementación conocidas:
AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue,
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList,
PriorityBlockingQueue, PriorityQueue, SynchronousQueue
Tenga en cuenta que AbstractQueue no es una clase concreta.
Algunos de estos son del paquete concurrente, por lo que si está implementando una cola de trabajo o algo similar, debe ir a ConcurrentLinkedQueue o PriorityBlockingQueue (para un montón) por ejemplo.
http://java.sun.com/javase/6/docs/api/java/util/Queue.html - ver la sección "Todas las clases de implementación conocidas". Hay una variedad de implementaciones que son adecuadas para diferentes propósitos.
Los Javadocs proporcionan una lista de clases que implementan Queue
.
Todas las clases de implementación conocidas:
AbstractQueue , ArrayBlockingQueue , ArrayDeque , ConcurrentLinkedQueue , DelayQueue , LinkedBlockingQueue , LinkedBlockingDeque , LinkedList , PriorityBlockingQueue , PriorityQueue , SynchronousQueue
También hay algunas subinterfaces que pueden serle útiles:
Todas las subinterfaces conocidas:
BlockingDeque <E>, BlockingQueue <E>, Deque <E>
import java.util.Queue;
solo eso
Enqueue function == Queue_Object.add(input_value);
Dequeue function == Queue_Object.pull(); //return the value and delete it from queue
No, no hay clase Queue
, porque hay muchas formas diferentes de implementar una cola y debes elegir la que mejor se adapte a tu caso de uso. Lo mismo ocurre con cualquiera de las otras colecciones en el marco de colecciones; por ejemplo, ArrayList
y LinkedList
implementan una List
. El patrón general, que es un buen uso de la herencia de objetos, es:
La interfaz , por ejemplo, Queue
, define el rol que desea que juegue un objeto;
Las subinterfaces , p. Ej., Deque
, amplían o especializan el rol; en este caso, una cola "deque" o de doble extremo le permite agregar y eliminar elementos de ambos extremos de la cola, en lugar de solo agregar al reverso y remover desde el frente;
Las clases proporcionan la implementación de cómo un objeto lleva a cabo el rol. Por ejemplo, un ArrayDeque
utiliza una matriz de tamaño ArrayDeque
para implementar una cola de doble extremo, que tiene diferentes fortalezas y debilidades para LinkedList
que utiliza una lista vinculada.
Para profundizar en la idea de una interfaz como un rol, tenga en cuenta que aunque ArrayDeque
implemente Deque
, puede usarlo como una Queue
sin tener que preocuparse por eso, porque la implementación de ambas interfaces significa que puede desempeñar ambos roles. Del mismo modo, LinkedList
puede usar un sombrero de List
, Queue
o Deque
.
Por esta razón, la forma normal (recomendada) de utilizar algo como el marco de Colecciones es programar en la interfaz , es decir, usar una interfaz cuando se usa la clase en lugar del nombre de la clase en sí. Por ejemplo, crearías una instancia de un objeto como este:
Queue<String> logQueue = new ConcurrentLinkedQueue<String>();
...
logQueue.add("Log message");
De esta manera eres
- no vinculado a una clase en particular y puede usar un reemplazo directo si es necesario sin tener que modificar mucho código, y
- están documentando lo que estás haciendo con una clase al nombrar la función que desempeña. El principio general con el que ayuda es el código de auto-documentación , que consiste esencialmente en dejar que el código sea autoexplicativo sin tener que usar comentarios, etc.