一个队列来存放某数据对象,但是这个对象的数量是巨大的,如果将这些对象都存入队列的话,很显然内存会爆表,但是这些对象有一个特征是,相同的数据对象类型的数据是可更新的。换句话说,对于同一类数据对象,后面来的对象的值一定比前面的新,是可以完全覆盖前面的。所以如果对象是可更新的,我们可以通过重写对象的hashcode和equals方法,然后放在Set集合中进行保存。但是我们还需要此数据结构能保存队列的FIFO特性,这时候该怎么办呢?所以在这里,我们需要能够自定义一个具有Set属性的Queue。
示例代码
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
public class SetQueue<T> {
private final Set<T> members = new HashSet();
private final Queue<T> queue = new LinkedList();
public SetQueue() {
}
public boolean addIfNotPresent(T item) {
if(this.members.contains(item)) {
return false;
} else {
this.members.add(item);
this.queue.offer(item);
return true;
}
}
public T poll() {
Object item = this.queue.poll();
if(item != null) {
this.members.remove(item);
}
return item;
}
public boolean contains(T item) {
return this.members.contains(item);
}
public boolean isEmpty() {
return this.members.isEmpty();
}
public boolean remove(T item) {
this.queue.remove(item);
return this.members.remove(item);
}
public void clear() {
this.queue.clear();
this.members.clear();
}
}