在分析了我的android游戏之后,我注意到在一个简单的迭代过程中生成了大量的concurrenthashmaps,我在整个主游戏循环中调用它。代码如下
public void checkIfStillNeedsToShowUI() {
for (Map.Entry<String, GameUI> gameUIEntry : listOfUIObjects.entrySet()) {
if(!gameUIEntry.getValue().isShowing()){//ignore what not showing
continue;
}
final GameUI tmpGameUI = (gameUIEntry.getValue());
if(!tmpGameUI.hasReasonForShowing()){
continue;
}
if(tmpGameUI.reasonForShowing.checkReason()){
tmpGameUI.setShowing(true);
} else {
tmpGameUI.setShowing(false);
}
}
}
结果如下
这正常吗?还是我做错了什么?我知道使用generic/enhanced for循环类型会导致创建一个对象来访问它,但是我目前还不知道迭代hashmap的其他方法可以得到想要的结果。
1条答案
按热度按时间jgwigjjp1#
它们不是
ConcurrentHashMap
,它们是MapEntry
.如果你是说
MapEntry
示例,答案是没有jdk在的迭代过程中创建这些对象的新示例ConcurrentHashMap
当你使用ConcurrentHashMap
你可以从照片上看到next
中的方法EntityIterator
类内部ConcurrentHashMap
. 问题是,要管理并发性,jdk需要存储类型为的对象Node
并且这些对象不被认为是源代码文档中提到的导出对象:键值输入。此类永远不会导出为用户可变的map.entry(即,一个支持setvalue;请参见下面的mapentry),但可以用于批量任务中使用的只读遍历。具有负散列字段的节点的子类是特殊的,并且包含空键和值(但从不导出)。否则,keys和vals永远不会为null。
所以呢
EntryIterator
类内部ConcurrentHashMap
类将此对象转换为MapEntry
内部next
方法。如果您只在单线程应用程序中使用map,那么可以使用HashMap
相反。