关于一些代码优化提升性能效率的总结

1、需要 Map 的主键和取值时,应该迭代 entrySet()

当循环中只需要 Map 的主键时,迭代 keySet() 是正确的。但是,当需要主键和取值时,迭代 entrySet() 才是更高效的做法,比先迭代 keySet() 后再去 get 取值性能更佳。

反例:

Map<String, String> map = ...;
for (String key : map.keySet()) {    
   String value = map.get(key);    
...}

正例:

Map<String, String> map = ...;
for (Map.Entry<String, String> entry : map.entrySet()) {    
     String key = entry.getKey();    
     String value = entry.getValue();   
 ...}

2、应该使用Collection.isEmpty()检测空

       使用 Collection.size() 来检测空逻辑上没有问题,但是使用 Collection.isEmpty()使得代码更易读,并且可以获得更好的性能。

       任何 Collection.isEmpty() 实现的时间复杂度都是 O(1) ,但是某些 Collection.size() 实现的时间复杂度可能是 O(n) 。

反例:

if (collection.size() == 0) {    ...}

正例:

if (collection.isEmpty()) {    ...}

如果需要还需要检测 null ,可采用CollectionUtils.isEmpty(collection)和CollectionUtils.isNotEmpty(collection)。

3、不要把集合对象传给自己

此外,由于某些方法要求参数在执行期间保持不变,因此将集合传递给自身可能会导致异常行为。

反例:

List<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
if (list.containsAll(list)) { 
// 无意义,总是返回true    ...
}
list.removeAll(list); // 性能差, 直接使用clear()

4、集合初始化尽量指定大小

 java 的集合类用起来十分方便,但是看源码可知,集合也是有大小限制的。每次扩容的时间复杂度很有可能是 O(n) ,所以尽量指定可预知的集合大小,能减少集合的扩容次数。

反例:

int[] arr = new int[]{1, 2, 3};
List<Integer> list = new ArrayList<>();
for (int i : arr) {  
  list.add(i);
}

正例:

int[] arr = new int[]{1, 2, 3};
List<Integer> list = new ArrayList<>(arr.length);
for (int i : arr) {    
list.add(i);
}

 

posted @ 2019-10-11 15:59  Gentleman-cx  阅读(383)  评论(0)    收藏  举报