加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

没落 Java 代码的“坏味道”

发布时间:2019-10-13 07:30:34 所属栏目:建站 来源:王超
导读:代码中的坏味道,如私欲如尘埃,天天都在增进,一日不去破除,便会越累越多。假如勤奋去破除这些坏味道,不只能进步本身的编码程度,也能使代码变得精白无一绝不彻。这里,一向从事Java研发相干事变的阿里高级舆图技能工程师王超,清算了一般事变中的一些
副问题[/!--empirenews.page--]

 没落 Java 代码的“坏味道”

代码中的"坏味道",如"私欲"如"尘埃",天天都在增进,一日不去破除,便会越累越多。假如勤奋去破除这些"坏味道",不只能进步本身的编码程度,也能使代码变得"精白无一绝不彻"。这里,一向从事Java研发相干事变的阿里高级舆图技能工程师王超,清算了一般事变中的一些"坏味道",及整理要领,供各人参考。

让代码机能更高

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

当轮回中只必要 Map 的主键时,迭代 keySet() 是正确的。可是,当必要主键和取值时,迭代 entrySet() 才是更高效的做法,比先迭代 keySet() 后再去 get 取值机能更佳。

反例:

  1. Map<String, String> map = ...; 
  2. for (String key : map.keySet()) { 
  3.     String value = map.get(key); 
  4.     ... 

正例:

  1. Map<String, String> map = ...; 
  2. for (Map.Entry<String, String> entry : map.entrySet()) { 
  3.     String key = entry.getKey(); 
  4.     String value = entry.getValue(); 
  5.     ... 

应该行使Collection.isEmpty()检测空

行使 Collection.size() 来检测空逻辑上没有题目,可是行使 Collection.isEmpty()使得代码更易读,而且可以得到更好的机能。任何 Collection.isEmpty() 实现的时刻伟大度都是 O(1) ,可是某些 Collection.size() 实现的时刻伟大度也许是 O(n) 。

反例:

  1. if (collection.size() == 0) { 
  2.     ... 

正例:

  1. if (collection.isEmpty()) { 
  2.     ... 

假如必要还必要检测 null ,可回收CollectionUtils.isEmpty(collection)和CollectionUtils.isNotEmpty(collection)。

不要把荟萃工具传给本身

另外,因为某些要领要求参数在执行时代保持稳固,因此将荟萃转达给自身也许会导致非常举动。

反例:

  1. List<String> list = new ArrayList<>(); 
  2. list.add("Hello"); 
  3. list.add("World"); 
  4. if (list.containsAll(list)) { // 有时义,老是返回true 
  5.     ... 
  6. list.removeAll(list); // 机能差, 直接行使clear() 

荟萃初始化只管指定巨细

java 的荟萃类用起来异常利便,可是看源码可知,荟萃也是有巨细限定的。每次扩容的时刻伟大度很有也许是 O(n) ,以是只管指定可预知的荟萃巨细,能镌汰荟萃的扩容次数。

反例:

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

正例:

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

字符串拼接行使 StringBuilder

一样平常的字符串拼接在编译期 java 会举办优化,可是在轮回中字符串拼接, java 编译期无法做到优化,以是必要行使 StringBuilder 举办替代。

反例:

  1. String s = ""; 
  2. for (int i = 0; i < 10; i++) { 
  3.     s += i; 

正例:

  1. String a = "a"; 
  2. String b = "b"; 
  3. String c = "c"; 
  4. String s = a + b + c; // 没题目,java编译器会举办优化 
  5. StringBuilder sb = new StringBuilder(); 
  6. for (int i = 0; i < 10; i++) { 
  7.     sb.append(i);  // 轮回中,java编译器无法举办优化,以是要手动行使StringBuilder 

List 的随机遇见

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读