加速HashSet和HashMap性能

时间:2012-08-06 16:54:39

标签: java integer hashmap hashset

在Java中,我有:

Set<Integer> set = new HashSet<Integer>();
callVoidMethod(set);
...
public static void callVoidMethod(Set<Integer> set) {

    Set<Integer> superset = new HashSet<Integer>(set);
    ...
    // I just added this loop to show that I'm adding quite a lot
    // well, it depends on conditions, sometimes I add nothing,
    // but it is unpredictable and do not know if add something
    for (int i = 0; i < 1000; i++) {
         ...
         if (conditionSatisfied) superset.add(someValue);
         ...
    }

}

上面的代码被简化了,想法是通过引用将集合传递给void方法并创建集合的完整副本,这样我们就可以向副本添加一些新元素(这里是超集)并且当我们退出void方法时,不要碰触集合,因为我们不需要它。

我的代码适用于大量数据处理,如果没有更快的方式来制作副本,那么我想优化HashSet本身,例如我不需要Integer键,但更好的原始int s。在int[]

中实现MyHashSet键数组是个好主意

如果可能,我会有兴趣使用相同的想法来改善这个:

Map<Integer, ArrayList<Item>> map = new HashMap<Integer, ArrayList<Item>>();

编辑:我只需要速度性能优化。我不需要漂亮的代码和内存。

3 个答案:

答案 0 :(得分:8)

通常,如果您正在寻找允许原语的高速集合,请考虑使用Trove。我会说 - 除非你发现这实际上是一个瓶颈,否则不要进行优化。您或其他人需要维护此代码,并且阅读优化版本通常更难。

答案 1 :(得分:6)

您是否尝试过首先调整HashSet的初始容量和加载因子?

HashSet

这是一篇可能对您有帮助的帖子。

HashMap initialization parameters

如果您需要处理如此大量的数据,那么分析它的分布并首先调整这些设置可能会有所收获。

调整过后,它可能会给使用整数替换整数提供非常轻微的性能,但它可能更多地依赖于JVM实现细节和硬件配置,而不仅仅是这种改进所带来的。

答案 2 :(得分:5)

您以后如何处理这些物体?如果您只是进行查找或类似的事情,将它们分开并检查两者可能会更快,而不是制作完整副本。所以,

public static void callVoidMethod(Set<Integer> set) {

    Set<Integer> superset = new HashSet<Integer>();
    ...
    if (conditionSatisfied) superset.add(someValue);

    ...
    if(set.contains(value) || superset.contains(value))
        doSomething();

}