一個隊列來存放某數(shù)據(jù)對象,但是這個對象的數(shù)量是巨大的下梢,如果將這些對象都存入隊列的話礁芦,很顯然內(nèi)存會爆表,但是這些對象有一個特征是际起,相同的數(shù)據(jù)對象類型的數(shù)據(jù)是可更新的擎淤。換句話說肮砾,對于同一類數(shù)據(jù)對象脑漫,后面來的對象的值一定比前面的新髓抑,是可以完全覆蓋前面的。所以如果對象是可更新的优幸,我們可以通過重寫對象的hashcode和equals方法吨拍,然后放在Set集合中進(jìn)行保存。但是我們還需要此數(shù)據(jù)結(jié)構(gòu)能保存隊列的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();
}
}