如何在Java8中迭代fastutil hashmap?

时间:2015-08-23 17:04:35

标签: java hashmap iteration

Java8中,想要比较我的应用中Int2ObjectOpenHashMapfastutil库)和HashMap<Integer, MyObj>的时间效果和内存消耗情况。以前我迭代java标准hashmap如下:

HashMap<Integer, MyObj> myobjs = new HashMap<Integer, MyObj>();
// fill myobjs in
for (Map.Entry<Integer, MyObj> obj : myobjs.entrySet()) {
    ...
} 

如何以最快的方式迭代Int2ObjectOpenHashMap

4 个答案:

答案 0 :(得分:2)

尝试:

Int2ObjectOpenHashMap<MyObj> myobjs = // ...
for(Int2ObjectMap.Entry<MyObj> entry : myobjs.int2ObjectEntrySet()) {
    int key = entry.getIntKey();
    MyObj obj = entry.getValue();
    // ...
}

答案 1 :(得分:2)

你可以使用stream和lambda表达式,

Int2ObjectOpenHashMap<Integer> myobjs = new Int2ObjectOpenHashMap<Integer>() ;
myobjs.forEach((key,value)->{
    int key1 =key;
    MyObj obj = value;
});
myobjs.entrySet().forEach(x->{
    int key = x.getKey();
    MyObj obj =x.getValue();
});
myobjs.entrySet().stream().forEach(x->{
    int key = x.getKey();
    MyObj obj = x.getValue();
});e

答案 2 :(得分:1)

Int2ObjectOpenHashMap也实现entrySet(),因此您以相同的方式进行迭代。

答案 3 :(得分:1)

条目集上有专门的fastForEach(),为了获得更高的性能,它无需为每个循环周期重新创建条目实例,而是重用类型Int2ObjectMap.Entry<MyObj>的条目实例:

Int2ObjectOpenHashMap<MyObj> int2ObjHashMap = ...;
int2ObjHashMap.int2ObjectEntrySet().fastForEach((Int2ObjectMap.Entry<MyObj> entry) -> {
    int key = entry.getIntKey();
    MyObj value = entry.getValue();
    // ...
});

通过使用特定于int的方法int2ObjectEntrySet()getIntKey()而不是entrySet()getKey(),此代码还避免了条目键对/不必要的收件箱和发件箱来自intInteger