Java中的小集:哪种数据结构?

时间:2012-09-10 06:48:51

标签: java set

对于集(比如说1-100个元素),各种Java集实现的性能是否有任何好的参考,或者有人可以告诉我更多信息? O(1)vs O(log n)故事几乎与这些大小无关,但由于我需要处理数百万这些小集,因此性能确实很重要。我找到的大多数参考文献都没有提到太多。

我需要对这些集合进行以下操作(通常每组只有几次):

  • 初始化新集和/或硬拷贝旧集
  • 添加/删除元素
  • 迭代集合
  • 计算整套的hashCode()

我认为这些是比较可行的选项(假设比较/散列T几乎是免费的):

  • HashSet< T> :迭代似乎不好(因此在hashCode()
  • TreeSet< T> :似乎有可笑的高开销
  • LinkedHashSet< T> :根本没有这方面的经验,是否有很高的开销?
  • ArrayList< T> :本身速度快但不是一套,所以像Collections.sort()这样丑陋的技巧需要......

以上哪项通常是首选?或者我应该写自己的SmallSet<T>课程?

2 个答案:

答案 0 :(得分:3)

如果您真的在寻找性能,那么您可以在此自行测试,这对您有所帮助:

  • 你是不是一直在分配它们?如果是这样,垃圾收集可能比其他情况更具相关性
  • 您是否需要分配一次并需要快速访问? Hashcollisions将对此产生影响
  • 你经常改变它们吗?

你需要设置一个类似于你实际使用的测试用例 - 测试时间足够长,以至于GC开始运行,你会看到效果。

如果您发现它们之间存在严重差异,请在每次更新JVM后重新运行测试,因为实现可能会发生变化。

在你完成这样的性能测试之前,我会给出我的标准建议:选择最好的可读选项,只有在使用可读性较低的明显收益时才改变它。代码维护者(可能是你的未来)会感谢你。

答案 1 :(得分:0)

这是一个小型Set实现为数组:

很容易满足您的需求:)

来源:https://highlyscalable.wordpress.com/2011/12/29/ultimate-sets-and-maps-for-java-p1/

public class ArraySet {
    private int[] array;
    private int size = 0;

    public ArraySet(int capacity) {
        array = new int[capacity];
        Arrays.fill(array, -1);
    }

    public boolean add(int key) {
        int index = Arrays.binarySearch(array, 0, size, key);
        if (index < 0) {
            int insertIndex = -index-1;

            if(size < array.length - 1) {
                if(insertIndex < size) {
                    System.arraycopy(array, insertIndex, array, insertIndex + 1, size - insertIndex);
                }
                array[insertIndex] = key;
            } else {
                int[] newArray = new int[array.length + 1];
                System.arraycopy(array, 0, newArray, 0, insertIndex);
                System.arraycopy(array, insertIndex, newArray, insertIndex + 1, array.length - insertIndex);
                newArray[insertIndex] = key;
                array = newArray;
            }

            size++;
            return true;
        }
        return false;
    }

    public int get(int position) {
        return array[position];
    }

    public int size() {
        return size;
    }

    public boolean contains(int key) {
        return Arrays.binarySearch(array, key) >= 0;
    }
}
相关问题