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