对于小集(比如说1-100个元素),各种Java集实现的性能是否有任何好的参考,或者有人可以告诉我更多信息? O(1)vs O(log n)故事几乎与这些大小无关,但由于我需要处理数百万这些小集,因此性能确实很重要。我找到的大多数参考文献都没有提到太多。
我需要对这些集合进行以下操作(通常每组只有几次):
hashCode()
我认为这些是比较可行的选项(假设比较/散列T几乎是免费的):
hashCode()
)Collections.sort()
这样丑陋的技巧需要...... 以上哪项通常是首选?或者我应该写自己的SmallSet<T>
课程?
答案 0 :(得分:3)
如果您真的在寻找性能,那么您可以在此自行测试,这对您有所帮助:
你需要设置一个类似于你实际使用的测试用例 - 测试时间足够长,以至于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;
}
}