更规范化编写Java 代码的重要性想必毋需多言,其中最重要的几点当属提高代码性能、使代码远离Bug、令代码更优雅。

引用https://mp.weixin.qq.com/s/0mrqhfVHmClqTvZNsd58xA

1,迭代entrySet() 获取Map 的key 和value

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

反例:

//Map 获取value 反例:
HashMap<String, String> map = new HashMap<>();
for (String key : map.keySet()){
String value = map.get(key);
}

正例:

  //Map 获取key & value 正例:
HashMap<String, String> map = new HashMap<>();
 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)。O(1)纬度减少循环次数 例子

反例:

LinkedList<Object> collection = new LinkedList<>();
if (collection.size() == 0){
  System.out.println("collection is empty.");
 }

正例:

LinkedList<Object> collection = new LinkedList<>();
  if (collection.isEmpty()){
      System.out.println("collection is empty.");
  }
  
  //检测是否为null 可以使用CollectionUtils.isEmpty()
  if (CollectionUtils.isEmpty(collection)){
      System.out.println("collection is null.");
  }

3,初始化集合时尽量指定其大小

尽量在初始化时指定集合的大小,前提是知道大概要多大的集合,能有效减少集合的扩容次数,因为集合每次扩容的时间复杂度很可能时O(n),耗费时间和性能。

反例:

//初始化list,往list 中添加元素反例:
int[] arr = new int[]{1,2,3,4};
List<Integer> list = new ArrayList<>();
for (int i : arr){
  list.add(i);
}

正例:

//初始化list,往list 中添加元素正例:
  int[] arr = new int[]{1,2,3,4};
  //指定集合list 的容量大小
  List<Integer> list = new ArrayList<>(arr.length);
  for (int i : arr){
      list.add(i);
  }

4,使用StringBuilder 拼接字符串

一般的字符串拼接在编译期Java 会对其进行优化,但是在循环中字符串的拼接Java 编译期无法执行优化,所以需要使用StringBuilder 进行替换。

反例:

//在循环中拼接字符串反例
String str = "";
for (int i = 0; i < 10; i++){
  //在循环中字符串拼接Java 不会对其进行优化
  str += i;
}

正例:

//在循环中拼接字符串正例
 String str1 = "Love";
 String str2 = "Courage";
 String strConcat = str1 + str2;  //Java 编译器会对该普通模式的字符串拼接进行优化
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < 10; i++){
     //在循环中,Java 编译器无法进行优化,所以要手动使用StringBuilder
      sb.append(i);
  }

5,返回空数组和集合而非 null

若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况,还可以删除调用方检测null 的语句使代码更简洁。

反例:

//返回null 反例
public static Result[] getResults() {
    return null;
}

public static List<Result> getResultList() {
    return null;
}

public static Map<String, Result> getResultMap() {
    return null;
}

正例:

//返回空数组和空集正例
public static Result[] getResults() {
    return new Result[0];
}

public static List<Result> getResultList() {
    return Collections.emptyList();
}

public static Map<String, Result> getResultMap() {
    return Collections.emptyMap();
}