SonarQube代码异味解惑:为何用entrySet替代keySet迭代?
关于SonarQube提示"Iterate over the entrySet instead of keySet"的解释
这条提示核心是在说:遍历Map的entrySet()比keySet()更符合性能最佳实践,尤其是当你可能需要同时操作key和对应的value时。
背后的原因
当你用keySet()遍历Map时,每次拿到key后如果要获取对应的value,都得调用map.get(key)——这个操作会触发Map内部的一次查找(比如HashMap要做哈希计算、遍历链表/红黑树)。而entrySet()直接返回包含key-value对的Map.Entry对象,一次遍历就能同时拿到key和value,完全避免了重复查找的开销。
针对你代码的修改示例
虽然你当前的代码只用到了key,但SonarQube建议你养成用entrySet的习惯(万一后续需要用到对应的Set<String> value,直接调用entry.getValue()即可,不用再查一次Map)。修改后的代码如下:
public Set<Date> getAccountShiftDate(Map<String, Set<String>> shiftDatesMap, List<Groups> shiftSchedule) { // set that has the account shift dates Set<Date> accountShiftDatesTemplate = new HashSet<>(); // 遍历entrySet而非keySet for (Map.Entry<String, Set<String>> entry : shiftDatesMap.entrySet()) { String account = entry.getKey(); // 若后续需要用到该账户对应的shift日期集合,直接用entry.getValue(),无需再调用shiftDatesMap.get(account) Set<String> shiftDates = entry.getValue(); //get group of an account Optional<Groups> shiftOptional = shiftSchedule.stream() .filter(g -> StringUtils.equalsIgnoreCase(account, g.getLongName())) .findFirst(); // ... 后续逻辑 } return accountShiftDatesTemplate; }
额外说明
如果你的代码确实永远不会用到key对应的value,那用keySet()本身不会有性能问题,但SonarQube的这条规则是从代码扩展性和最佳实践角度出发,让你统一使用更灵活的遍历方式,避免后续修改代码时不小心引入低效的重复查找操作。
内容的提问来源于stack exchange,提问作者user21066109
相关产品推荐
相关产品推荐

