java中固定大小的数据结构

时间:2011-04-01 09:42:53

标签: java data-structures

我想要一个java中的数据结构(多线程环境),它最多可以包含'n'个元素。如果我添加第(n + 1)个元素,那么我应该用这个新元素替换最旧的元素。我知道我可以通过检查每个add()的大小并以完整大小进行替换操作来实现。但是,我想知道java库中是否有任何数据结构。请帮忙

3 个答案:

答案 0 :(得分:3)

尝试使用固定大小的数组,并使用索引模数大小添加。这被称为圆形阵列,Wikipedia有关于这个主题的不错的文章。

基本上,你跟踪一个你应该编写下一个条目的索引,并让该索引环绕缓冲区大小,然后当你继续写入时,你将覆盖最旧的条目。

这样的事情:

Object[] ring = new Object[32];
int writeIndex = 0;

public void add(Object o) {
  ring[writeIndex % ring.length] = o;
  writeIndex++;
}

答案 1 :(得分:2)

这是一个循环队列,没有java本地类。你可以看一下ArrayCircularQueue

答案 2 :(得分:2)

根据您的需要,一种方法是包装LinkedHashMap的子类。

import java.util.AbstractSet;
import java.util.Iterator;
import java.util.LinkedHashMap;

public class FixedSizeSet<E> extends AbstractSet<E> {
    private final LinkedHashMap<E, E> contents;

    FixedSizeSet(final int maxCapacity) {
        contents = new LinkedHashMap<E, E>(maxCapacity * 4 /3, 0.75f, false) {
            @Override
            protected boolean removeEldestEntry(java.util.Map.Entry<E, E> eldest) {
                return size() == maxCapacity;
            }
        };      
    }

    @Override
    public Iterator<E> iterator() {
        return contents.keySet().iterator();
    }

    @Override
    public int size() {
        return contents.size();
    }

    public boolean add(E e) {
        boolean hadNull = false;
        if (e == null) {
            hadNull = contents.containsKey(null);
        }
        E previous = contents.put(e, e);
        return e == null ? hadNull : previous != null;
    }

    @Override
    public boolean contains(Object o) {
        return contents.containsKey(o);
    }
}