我需要在OpenGL循环的每一帧上迭代一些HashMaps。我是这样做的:
for (Map.Entry<MyKey, MyValue> entry : myMap.entrySet(){...}
我关心的是这个对entrySet()
的调用是否实际实例化并在每次调用时填充一个全新的Map.Entry对象,因为如果是这样的话,GC会比我在制作动画时更加忙碌在OpenGL中。我的直觉说不,因为HashMap文档说您可以使用返回的条目集直接修改HashMap,但我不知道如何确定。
我也想知道其他Map实现,比如Hashtable,TreeMap和LinkedHashMap。
答案 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)时间。实际上,迭代遍历它的入口对象是地图用来实现其内部数据结构的对象。
(那,并且没有其他方法可以做你想做的事情。)