Una pregunta muy simple y rápida sobre las bibliotecas de Java: ¿hay una clase preparada que implemente una Queue
con un tamaño máximo fijo?
Por supuesto, es trivial implementarlo manualmente:
import java.util.LinkedList;
public class LimitedQueue<E> extends LinkedList<E> {
private int limit;
public LimitedQueue(int limit) {
this.limit = limit;
}
@Override
public boolean add(E o) {
super.add(o);
while (size() > limit) { super.remove(); }
return true;
}
}
Por lo que veo, no hay una implementación estándar en las stdlibs de Java, pero ¿puede haber una en Apache Commons o algo así?
collections
queue
java
Gato gris
fuente
fuente
Respuestas:
Apache commons collections 4 tiene un CircularFifoQueue <> que es lo que está buscando. Citando al javadoc:
Si está utilizando una versión anterior de las colecciones comunes de Apache (3.x), puede utilizar el CircularFifoBuffer, que es básicamente lo mismo sin genéricos.
Actualización : respuesta actualizada después del lanzamiento de la versión 4 de colecciones comunes que admite genéricos.
fuente
EvictingQueue
agregado a Google Guava versión 15 alrededor de 2013-10.Guava ahora tiene un EvictingQueue , una cola sin bloqueo que desaloja automáticamente los elementos del encabezado de la cola cuando intenta agregar nuevos elementos a la cola y está llena.
fuente
EvictingQueue
es un FIFO. En caso de duda, pruebe este programa:Queue<Integer> fifo = EvictingQueue.create(2); fifo.add(1); fifo.add(2); fifo.add(3); System.out.println(fifo);
Observe el resultado:[2, 3]
Me gusta la solución @FractalizeR. ¡Pero además mantendría y devolvería el valor de super.add (o)!
fuente
LinkedList
no es seguro para subprocesos tampoco sería inútil. En el contexto de esta pregunta, el requisito específico de OP hace que sea particularmente importante que la adición de un elemento se realice como una operación atómica. en otras palabras, el riesgo de no garantizar la atomicidad sería mayor que en el caso de una LinkedList regular.add(int,E)
lugar. Y siaddAll
funciona según lo previsto, depende de detalles de implementación no especificados. Es por eso que debería preferir la delegación sobre la herencia ...Usar composición no se extiende (sí, me refiero a extensiones, como en una referencia a la palabra clave extend en java y sí, esto es herencia). La composición es superior porque protege completamente su implementación, permitiéndole cambiarla sin afectar a los usuarios de su clase.
Recomiendo probar algo como esto (estoy escribiendo directamente en esta ventana, así que el comprador tenga cuidado con los errores de sintaxis):
Una mejor opción (basada en la respuesta de Asaf) podría ser envolver el Apache Collections CircularFifoBuffer con una clase genérica. Por ejemplo:
fuente
LinkedList
se implementa, entonces. El objeto adicional creado como un contenedor alrededor de la lista será bastante menor, incluso con "decenas de millones" de instancias.Lo único que sé que tiene espacio limitado es la interfaz BlockingQueue (que, por ejemplo, está implementada por la clase ArrayBlockingQueue), pero no eliminan el primer elemento si está lleno, sino que bloquean la operación de colocación hasta que el espacio esté libre (eliminado por otro hilo )
Que yo sepa, su implementación trivial es la forma más fácil de obtener ese comportamiento.
fuente
BlockingQueue
no es una respuesta. ¿He pensado en otras bibliotecas comunes, como Apache Commons, las bibliotecas de Eclipse, Spring, las adiciones de Google, etc.?Puede usar un MinMaxPriorityQueue de Google Guava , de javadoc:
fuente
Map
comportamiento como aList
. Pero ambas ideas muestran una completa incomprensión de algoritmos y diseño de software.MinMaxPriorityQueue
a lo que el OP quiere es más trivial que modificar aLinkedList
(el código del OP ni siquiera se acerca).long
tipo de cursor descendente como dentro de mi propia sugerencia, diciendo que sería lo suficientemente amplio en la práctica, aunque en teoría podría agregar más de 2 ^ 64 objetos a esta cola, en cuyo punto la solución se rompería .Un LRUMap es otra posibilidad, también de Apache Commons.
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/LRUMap.html
fuente
fuente