调用HashMap.entrySet()每次实例化并填充一个新集合吗?

时间:2014-01-28 02:17:46

标签: java

我需要在OpenGL循环的每一帧上迭代一些HashMaps。我是这样做的:

for (Map.Entry<MyKey, MyValue> entry : myMap.entrySet(){...}

我关心的是这个对entrySet()的调用是否实际实例化并在每次调用时填充一个全新的Map.Entry对象,因为如果是这样的话,GC会比我在制作动画时更加忙碌在OpenGL中。我的直觉说不,因为HashMap文档说您可以使用返回的条目集直接修改HashMap,但我不知道如何确定。

我也想知道其他Map实现,比如Hashtable,TreeMap和LinkedHashMap。

3 个答案:

答案 0 :(得分:1)

在审核来源后,答案是否定的。它懒惰地实例化第一次调用entrySet()时设置的条目,然后在每次后续调用时返回对同一对象的引用。

LinkedHashMap,Hashtable和TreeMap也是如此。

答案 1 :(得分:1)

不,它不会创建一个新的Set,而是一个轻量级的包装器,例如。 Arrays.asList,API说The set is backed by the map, so changes to the map are reflected in the set, and vice-versa.

答案 2 :(得分:0)

HashMap.entrySet的实现只是一个廉价的视图,每次调用它都需要花费O(1)时间。实际上,迭代遍历它的入口对象是地图用来实现其内部数据结构的对象。

(那,并且没有其他方法可以做你想做的事情。)