在初始化的时候预估集合的大小
Java的这篇 文档我们可以了解到: “一个HashMap 实例有两个影响它性能的因素:初始大小和加载因子(load factor)。 […] 当哈希表的大小达到初始大小和加载因子的乘积的时候,哈希表会进行 rehash操作 […] 如果在一个HashMap 实例里面要存储多个映射关系时,我们需要设置足够大的初始化大小以便更有效地存储映射关系而不是让哈希表自动增长让后rehash,造成性能瓶颈。” 在Linkedin实践的时候,常常碰到需要遍历一个 ArrayList
并将这些元素保存到 HashMap
里面去。将这个 HashMap
初始化预期的大小可以避免再次哈希所带来的开销。初始化大小可以设置为输入的数组大小除以默认加载因子的结果值(这里取0.7):
<pre name="code" class="java">HashMap<String, String> _map; void addObjects(List<String> input) { _map = new HashMap<String, String>(<span style="color:#CC0000;">(int) Math.ceil(input.size() / 0.7)</span>); for (String f : input) { _map.put(f, f); } }
提前编译正则表达式
字符串的操作在Java中算是开销比较大的操作。还好Java提供了一些工具让正则表达式尽可能地高效。动态的正则表达式在实践中比较少见。在接下来要举的例子中,每次调用 String.replaceAll()
都包含了一个常量模式应用到输入值中去。因此我们预先编译这个模式可以节省CPU和内存的开销。
- 优化前:
private String transform(String term) { return outputTerm = term.replaceAll(_regex, _replacement); }
- 优化后:
private final Pattern _pattern = Pattern.compile(_regex); private String transform(String term) { String outputTerm = _pattern.matcher(term).replaceAll(_replacement); }