SetQueue的设计思想

     一个队列来存放某数据对象,但是这个对象的数量是巨大的,如果将这些对象都存入队列的话,很显然内存会爆表,但是这些对象有一个特征是,相同的数据对象类型的数据是可更新的。换句话说,对于同一类数据对象,后面来的对象的值一定比前面的新,是可以完全覆盖前面的。所以如果对象是可更新的,我们可以通过重写对象的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();
}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。