繁体   English   中英

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

[英]Does calling HashMap.entrySet() instantiate and populate a new set every time?

我需要在OpenGL循环的每一帧上遍历一些HashMap。 我这样做是这样的:

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

我担心的是,每次调用entrySet()是否实际上会实例化并填充一个全新的Map.Entry对象,因为如果是这样,则GC会比我在OpenGL中进行动画时要忙得多。 我的直言不讳,因为HashMap文档说您可以使用返回的条目集直接修改HashMap,但是我不确定如何确定。

我还想了解其他Map实现,例如Hashtable,TreeMap和LinkedHashMap。

在检查了源之后,答案是否定的。 它在第一次调用entrySet()延迟实例化条目集,然后在每个后续调用中返回对相同对象的引用。

LinkedHashMap,Hashtable和TreeMap也是如此。

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

HashMap.entrySet的实现只是一个便宜的视图,每次调用都需要O(1)时间来创建。 实际上,通过迭代获得的入口对象是地图用来实现其内部数据结构的对象。

(那样,实际上没有其他方法可以完成您想做的事情。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM