在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>>();
编辑:我只需要速度性能优化。我不需要漂亮的代码和内存。
答案 0 :(得分:8)
通常,如果您正在寻找允许原语的高速集合,请考虑使用Trove。我会说 - 除非你发现这实际上是一个瓶颈,否则不要进行优化。您或其他人需要维护此代码,并且阅读优化版本通常更难。
答案 1 :(得分:6)
您是否尝试过首先调整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();
}