java—可以迭代concurrenthashmap而不创建新对象吗?

bsxbgnwa  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(351)

在分析了我的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的其他方法可以得到想要的结果。

jgwigjjp

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 相反。

相关问题