加速HashSet和HashMap性能

Sop*_*ner 3 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);
         ...
    }

}
Run Code Online (Sandbox Code Playgroud)

上面的代码是简化的,想法是通过引用将集合传递给void方法并创建集合的完整副本,以便我们能够向副本添加一些新元素(这里是超集)并且不要触摸设置为我们在退出void方法时不需要它.

我的代码适用于大量数据处理,如果没有更快的方法来制作副本,那么我想优化HashSet自身,例如我不需要Integers作为键,但更好的原始ints.在一个int[]键中实现一系列键是个好主意MyHashSet吗?

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

Map<Integer, ArrayList<Item>> map = new HashMap<Integer, ArrayList<Item>>();
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*ani 8

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


Aca*_*lco 6

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

HashSet的

这是一篇可能对你有帮助的帖子.

HashMap初始化参数

如果要处理如此大量的数据,可能需要先分析它的分布并调整这些设置.

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


Car*_*arl 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();

}
Run Code Online (Sandbox Code Playgroud)