修复SpotBugs告警:使用keySet迭代器而非entrySet导致效率低下的问题
告警根因说明
触发告警的SpotBugs规则:Inefficient use of keySet iterator instead of entrySet iterator
该告警触发原因是原有代码遍历Map的keySet获取键后,额外调用get(key)方法查询对应值,相当于对Map进行了两次遍历操作:一次遍历获取所有键,每次查询值时还要再做一次哈希寻址查找。替换为entrySet遍历可同时拿到键和值,省去额外的查询开销,性能更优。
优化后代码
Map<?, ?> rolePrincipleMap = cnRoleHolder.getRolePrincipalMap(); Iterator<? extends Map.Entry<?, ?>> cnRoleIterator = rolePrincipleMap.entrySet().iterator(); while (cnRoleIterator.hasNext()) { Map.Entry<?, ?> entry = cnRoleIterator.next(); Object cnRole = entry.getKey(); if (!SUBMITTER.equals(cnRole.toString())) { ArrayList<?> cnRoleMembersList = (ArrayList<?>) entry.getValue(); // 原有业务操作保持不变 } }
优化点说明
- 直接遍历
Map.entrySet()同时获取键值对,完全消除冗余的get(key)查询开销,直接修复对应SpotBugs告警 - 原有业务逻辑100%保留,未修改角色过滤、成员列表获取的核心逻辑,无业务兼容性风险
- 针对大容量Map场景优化效果更明显,避免了多次哈希计算、寻址的性能损耗
内容的提问来源于stack exchange,提问作者Tanvi Sharma
相关产品推荐
相关产品推荐

