在Java8
中,想要比较我的应用中Int2ObjectOpenHashMap
(fastutil
库)和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
?
答案 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()
,此代码还避免了条目键对/不必要的收件箱和发件箱来自int
和Integer
。