【问题标题】:SpotBugs warning: Inefficient use of keySet iterator instead of entrySet iterator [duplicate]SpotBugs 警告:使用 keySet 迭代器而不是 entrySet 迭代器效率低下[重复]
【发布时间】:2021-10-10 07:21:21
【问题描述】:

现有代码:

     Map<?, ?> rolePrincipleMap = cnRoleHolder.getRolePrincipalMap();
                Iterator<?> cnRoleIterator = rolePrincipleMap.keySet().iterator();
                  while (cnRoleIterator.hasNext()) {
                    Object cnRole = cnRoleIterator.next();
                  if (!SUBMITTER.equals(cnRole.toString())) {
               ArrayList<?> cnRoleMembersList = (ArrayList<?>) rolePrincipleMap.get(cnRole);
               //operations
}}

错误在定义 ArraList 的位置。请帮忙更新代码。

【问题讨论】:

标签: java iterator spotbugs keyset entryset


【解决方案1】:

该错误警告您正在访问映射以检索所有键,然后对于某些键,您再次访问映射以检索值。检索映射的条目会更有效,因为每个条目已经具有键和值:

for ( Map.Entry<?, ?> entry : rolePrincipleMap.entrySet() ) {
   Object cnRole = entry.getKey();
   if (!SUBMITTER.equals(cnRole.toString())) {
           ArrayList<?> cnRoleMembersList = (ArrayList<?>) entry.getValue();
           //operations
   }
}

【讨论】:

  • 感谢您的解释。我得到了这背后的逻辑原因。但仍然坚持优化代码以解决问题。如果能优化整个代码sn-p会很有帮助
  • @TanviSharma 我已修改我的答案,以包含您在问题中发布的代码的相应版本。我缺少有关您的代码的一些上下文,以确保我的版本正是您想要的,但它应该是这个或相当相似。如果它有助于解决您的问题,请记住将我的答案标记为已接受。这样以后遇到同样问题的其他人就可以找到您的问题并轻松了解如何解决。
猜你喜欢
  • 2012-09-20
  • 2015-12-23
  • 2013-10-30
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2018-10-16
相关资源
最近更新 更多