最近看到了一篇好文章:html
Map best practices - http://blog.tremblay.pro/2019/08/map.html框架
虽然内容精简,可是思路确实很赞。性能
假设咱们有一个Map<String,List<String>>
的Map,咱们想实现分组,通常思路是先看这个key是否存在,不存在的话,就新建一个List并放入,存在就返回这个List。优化
通常的实现是:debug
if (map.containsKey(key)) { // 第一次哈希 return map.get(key); // 第二次哈希 } List<String> list = new ArrayList<>(); map.put(key, list); //第三次哈希 return list;
若是假设咱们的Map不会存储null值,那么能够经过以下代码省略一次哈希操做:code
List<String> list = map.get(key); // 第一次哈希 if(list == null) { list = new ArrayList<>(); map.put(key, list); // 第二次哈希 } return list;
接下来再优化,咱们能够利用puIfAbsent
方法:htm
map.putIfAbsent(key, new ArrayList<>()); // 第一次哈希 return map.get(key); // 第二次哈希
可不能够把哈希操做削减为一次呢?Java8以后,能够这么操做:blog
return map.computeIfAbsent(key, unused -> new ArrayList<>()); 只有一次哈希操做
Java8以后引入的λ表达式,和Functional Interface,不少地方能够用来经过省略掉用结合判断这样提高性能,减小没必要要的调用。例如在Log4j2的框架中rem
if (log.isDebugEnabled()) { log.debug("{} inited!", JSON.toJSONString(a)); }
就能够替换成:get
log.debug("{} inited!", () -> JSON.toJSONString(a));